(за правильность не ручаюсь, буду благодарен за замечания)
- Складской учет не ведется.
- Товары и услуги указываются в одной табличной части.
- Списание себестоимости товаров организовано по партиям, в зависимости от метода списания себестоимости (FIFO, по средней или LIFO), который может меняться раз в день (изменение фиксируется соответствующим документом).
- Документы задним числом не вводятся, старые документы могут перепроводиться в неоперативном режиме (т.е. необходимо будет уточнять параметр МоментВремени при проведении расходной накладной)
[свернуть]
- Включить возможность использования обычных форм (нужно для Консоли запросов):
- Сервис – Параметры – Общие - флаг «Управляемое приложение и обычное приложение»;
- свойства конфигурации – флаг «Использовать обычные формы в управляемом приложении»;
- Настройка конфигурации (свойства):
- свойства конфигурации – Режим управления блокировкой данных - Управляемый;
- добавить кнопку запуска отладки под Толстым клиентом (эта обработка Консоль запросов запускается только под ним).
- Создать Подсистемы (порядок – согласно порядку задачи: <конфигурация> – пкм – Открыть командный интерфейс):
- Оперативный учет;
- Бухгалтерский учет;
- Расчеты;
- Бизнес-процессы (или Управляемые формы) – по задаче;
- Сервис.
- Упорядочить подсистемы можно в режиме 1С Предприятие (Настройки – Настройка панели разделов).
- В созданные подсистемы (Подсистемы – пкм – Все подсистемы) добавить те объекты, которые должны в них входить (отображаться в интерфейсе):
- Создать Группы команд:
- Справочники;
- Документы;
- ПланыВидовХарактеристик;
- РегистрыСведений;
- РегистрыОУ;
- РегистрыБУ;
- РегистрыСПР.
- Например, подсистема "Оперативный учет" может включать:
- Справочник Номенклатура;
- Документ Приходная накладная;
- Документ Расходная накладная;
- Регистр накопления Остатки номенклатуры и т.д.
- Создать Группы команд:
- Распределить объекты подсистем по соответствующим группам команд.
- Настроить интерфейс клиентского приложения (<конфигурация> – пкм – Открыть интерфейс клиентского приложения):
- Сверху убрать Панель функций текущего раздела, добавить Панель открытых;
- Слева – Панель разделов.
- Включить возможность использования Консоли запросов (запускается только под Толстым клиентом):
- В модуле формы консоли изменить обработку исключения
Предупреждение(Сред(ОписаниеОшибки(),69));
наПоказатьПредупреждение(,Сред(ОписаниеОшибки(),69))
;
- В модуле формы консоли изменить обработку исключения
Определяем список документов, используемых в решении. Все они явно описаны в задании, свои не добавлять.
- Добавим документ
УстановкаУчетнойПолитики
, реквизитМетодСписания
, типПеречислениеСсылка.УчетнаяПолитика
. - Создать форму документа.
- Не забыть установить его регистратором для регистра сведений, в котором будет храниться учетная политика.
- Оформить процедуру ОбработкаПроведения:
1 2 3 4 5 6 7 8 9 |
Процедура ОбработкаПроведения(Отказ, Режим) // регистр УчетнаяПолитика Движения.УчетнаяПолитика.Записывать = Истина; Движение = Движения.УчетнаяПолитика.Добавить(); Движение.Период = Дата; Движение.МетодСписания = МетодСписания; КонецПроцедуры |
- Добавим в документ
РасходнаяНакладная
реквизитМетодСписания
, типПеречислениеСсылка.УчетнаяПолитика
. - Создадим форму документа, для поля
МетодСписания
установим свойствоДоступность - Ложь
. - Оформим в процедуре формы
ПриСозданииНаСервере
получение значенияМетодСписания
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) // если документ новый - получаем метод списания Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда Объект.МетодСписания = РегистрыСведений.МетодСписания.ПолучитьПоследнее(ТекущаяДата()).МетодСписания; КонецЕсли; // если метод списания для документа не заполнен, выводим сообщение и отказываем в создании формы Если НЕ ЗначениеЗаполнено(Объект.МетодСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "На дату документа не задана учетная политика!"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецПроцедуры |
- Если в условии упоминаются услуги, то сразу готовим конфигурацию:
- проверяем (создаем)
Перечисления.ВидыНоменклатуры
со значениямиТовар
,Услуга
; - в справочник Номенклатура добавляем реквизит
ВидНоменклатуры
, типПеречислениеСсылка.ВидыНоменклатуры
;
- проверяем (создаем)
- Если в условии упоминается учетная политика (ФИФО, ЛИФО, средняя), то сразу готовим конфигурацию:
- проверяем (создаем)
Перечисления.УчетнаяПолитика
со значениямиФИФО
, ЛИФО, Средняя; - создать регистр сведений (периодический)
УчетнаяПолитика
(по нему будем определять метод учетной политики на дату документа):- периодичность - по заданию (например,
В пределах года
); - режим записи -
Независимый
; - добавить его в подсистему (например, ОУ);
- вкладка "Данные" - добавить ресурс
МетодСписанияСебестоимости
с типомПеречислениеСсылка.УчетнаяПолитика
.
- периодичность - по заданию (например,
- проверяем (создаем)
- Если ведется складской учет, то сразу готовим конфигурацию:
- добавляем справочник
Склады
; - в регистры накопления добавить измерение
Склад
, типСправочникСсылка.Склады
;
- добавляем справочник
- (При желании, сэкономит время на правильный ввод данных в документы) Настроить автоподсчет сумм (строка и документ) в Приходной и Расходной накладных (общий модуль + модули форм документов, в свойствах общего модуля проверить флаги «Клиент», «Сервер»):
- при изменении в строке табличной части
Количество
иЦена
; - при удалении или добавлении копированием.
- при изменении в строке табличной части
Это не обязательно. Процедуры можно создать для одного документа, а в модуль второго просто скопировать, назначив затем в свойствах.
Создать общий модуль РаботаСДокументами
:
-
- не забыть
Экспорт
; - установить флаг "Клиент (управляемое приложение)":
- не забыть
1 2 3 4 5 6 7 8 9 10 |
Процедура СуммаПоСтроке(ТекДанные) Экспорт ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена; КонецПроцедуры // для расчета цены при вводе значения в поле Сумма Процедура ЦенаПоСумме(ТекДанные) Экспорт Если ТекДанные.Количество <> 0 Тогда ТекДанные.Цена = ТекДанные.Сумма / ТекДанные.Количество; КонецЕсли; КонецПроцедуры |
Создать форму документа, в модуле формы определить процедуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
&НаКлиенте Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент) ТекДанные = Элементы.СписокНоменклатуры.ТекущиеДанные; РаботаСДокументами.СуммаПоСтроке(ТекДанные); Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры &НаКлиенте Процедура СписокНоменклатурыЦенаПриИзменении(Элемент) ТекДанные = Элементы.СписокНоменклатуры.ТекущиеДанные; РаботаСДокументами.СуммаПоСтроке(ТекДанные); Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры &НаКлиенте Процедура СписокНоменклатурыСуммаПриИзменении(Элемент) ТекДанные = Элементы.СписокНоменклатуры.ТекущиеДанные; РаботаСДокументами.ЦенаПоСумме(ТекДанные); Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры // Для подсчета суммы по документу при копировании строки &НаКлиенте Процедура СписокНоменклатурыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если Копирование Тогда Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецЕсли; КонецПроцедуры // Для подсчета суммы по документу при удалении строки &НаКлиенте Процедура СписокНоменклатурыПослеУдаления(Элемент) Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры |
Общий алгоритм:
- Определить количество ресурсов – по накапливаемым данным (количество, сумма, себестоимость, сумма продажи и т.д.). Добавить в соответствующий регистр, проверив соответствие типа, длины и точности.
- Определить количество измерений – по детализации ресурсов (склад, партия, контрагент, номенклатура и т.д.). Добавить соответствующие измерения.
- Проверить установку флага «Запрет незаполненных значений» (при необходимости).
- Регистр накопления:
- Прочее - флаг «Разрешить разделение итогов» - включить.
Проанализируем условие задачи и таблицы из условия:
Метод списания себестоимости (FIFO, по средней или LIFO) может меняться каждый день, изменение фиксируется соответствующим документом.
Т.о. нам понадобится:
- документ
УстановкаУчетнойПолитики
(уже создали ранее), фиксирующий изменение учетной политики; - регистр сведений
УчетнаяПолитика
,Периодичность - В пределах дня
,Режим записи - Подчинение регистратору
, вкладкаРегистратор - УстановкаУчетнойПолитики
, ресурсМетодСписания
(типПеречислениеСсылка.УчетнаяПолитика
); - регистр накопления
ОстаткиНоменклатурыБезПартий
- для учета остатков при применении метода списания "По средней".
Необходимо построить отчеты по продажам товаров за период и остаткам товара на указанную дату.
Т.о. нам понадобятся 3 регистра накопления:
- первый - остатков;
- второй - остатков без партий;
- третий - оборотный, по продажам.
В регистрах будут храниться:
- Регистр
ОстаткиНоменклатуры
(для ФИФО и ЛИФО):измерения:
Номенклатура
, типСправочникСсылка.Номенклатура
;Партия
, типДокументСсылка.ПриходнаяНакладная
;
- ресурсы:
Количество
;Себестоимость
, типЧисло
(длина 12, точность 2);
- регистраторы:
ПриходнаяНакладная
,РасходнаяНакладная
;
- Регистр
ОстаткиНоменклатурыБезПартий
(для По средней):измерения:
Номенклатура
, типСправочникСсылка.Номенклатура
;
- ресурсы:
Количество
;Себестоимость
, типЧисло
(длина 12, точность 2);
- регистраторы:
ПриходнаяНакладная
,РасходнаяНакладная
;
- Регистр Продажи (вид регистра
Обороты
) (видео от Леонтьева, с 30 мин):- измерение:
Номенклатура
, типСправочникСсылка.Номенклатура
;
- ресурсы:
Количество
;Себестоимость
(дублирование, НО упростит формирование отчета);СуммаПродажи
, типЧисло
(длина 12, точность 2);
- измерение:
Замечание: Решение на двух регистрах более эффективно (работает быстрее, размеры таблиц меньше), но менее достоверно (необходима синхронизация регистров, на экзамене синхронизацию программно НЕ ДЕЛАТЬ!)
- Добавить реквизиты по заданию (поле
Партия
в шапку документаРасходнаяНакладная
). - Добавить и настроить форму:
- форму документов создавать после добавления всех реквизитов документа (ускорение разработки).
- в командном интерфейсе форм в пункт «Перейти» добавить ссылки на регистры, установив соответствующие флажки.
- На вкладке «Движения»:
- Проведение – Разрешить (при ручном вводе движений – Запрещено);
- Оперативное проведение – Разрешить;
- Удаление движений – Удалять автоматически при отмене проведения.
- Движения формировать через конструктор (табличная часть выбирается только тогда, когда из неё заполняются измерения!) и определить методику проведения:
- если для заполнения набора записей данные регистра не нужны – новая (если новая и приход – то контроль не нужен);
- если для заполнения набора записей данные регистра нужны - старая.
Особенности:
- Приходная накладная записывает движения в регистры накопления
ОстаткиНоменклатуры
иОстаткиНоменклатурыБезПартий.
- В запросе:
- условие - по ссылке на документ;
- группировка по
Номенклатура
, - суммируем
Количество
иСебестоимость
.
Порядок действий:
- Отметить
ПриходнаяНакладная
как регистратор для регистровОстаткиНоменклатуры
иОстаткиНоменклатурыБезПартий
; - Сформировать движения (через конструктор), вручную заполнив в колонке "Выражение" поля
Партия
иСебестоимость
; - Сформировать запрос для выборки данных из документа для движений, указав:
- условия: ссылка на документ, вид номенклатуры - Товар;
- в качестве
Партия
-Ссылка
; - в качестве
Себестоимость
-Выборка.Сумма
(код процедуры ОбработкаПроведения см. ниже).
- Завести пользовательские данные в режиме 1С Предприятие, провести документ, проверить движения (добавить ссылку на соответствующий регистр в форму документа: (три верикальные точки) – Окно – Настройка панели навигации формы).
Код процедуры ОбработкаПроведения документа ПриходнаяНакладная:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатурыБезПартий.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | И ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры = &ВидНоменклатуры | |СГРУППИРОВАТЬ ПО | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); // при использовании условия проверить, что для номенклатуры указан вид номенклатуры - Товар Запрос.УстановитьПараметр("ВидНоменклатуры", Перечисления.ВидыНоменклатуры.Товар); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // регистр ОстаткиНоменклатуры Приход Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ВыборкаДетальныеЗаписи.Количество; Движение.Себестоимость = ВыборкаДетальныеЗаписи.Сумма; // регистр ОстаткиНоменклатурыБезПартий Приход Движение = Движения.ОстаткиНоменклатурыБезПартий.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.КоличествоБезПартий = ВыборкаДетальныеЗаписи.Количество; Движение.СебестоимостьБезПартий = ВыборкаДетальныеЗаписи.Сумма; КонецЦикла; КонецПроцедуры |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
Процедура ОбработкаПроведения(Отказ, Режим) // 1. получаем МетодСписания // (в процедуре ПриСозданииНаСервере) // очищаем движения регистров и взводим флаг на запись Движения.ОстаткиНоменклатуры.Записать(); Движения.ОстаткиНоменклатурыБезПартий.Записать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатурыБезПартий.Записывать = Истина; Движения.Продажи.Записывать = Истина; // 2. ставим блокировку данных Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатурыБезПартий"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); // 3. получаем данные запросом Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление КАК НоменклатураПредставление |ПОМЕСТИТЬ ВТТЧ_Товары |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТТЧ_Товары.Номенклатура КАК Номенклатура, | ВТТЧ_Товары.Количество КАК Количество, | ВТТЧ_Товары.Сумма КАК Сумма, | ВТТЧ_Товары.НоменклатураПредставление КАК НоменклатураПредставление, | ОстаткиНоменклатурыОстатки.Партия КАК Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СебестоимостьОстаток, 0) КАК СебестоимостьОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.КоличествоБезПартийОстаток, 0) КАК КоличествоБезПартийОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.СебестоимостьБезПартийОстаток, 0) КАК СебестоимостьБезПартийОстаток, | ВТТЧ_Товары.Номенклатура.ВидНоменклатуры КАК НоменклатураВидНоменклатуры |ИЗ | ВТТЧ_Товары КАК ВТТЧ_Товары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТТЧ_Товары.Номенклатура КАК Номенклатура | ИЗ | ВТТЧ_Товары КАК ВТТЧ_Товары)) КАК ОстаткиНоменклатурыОстатки | ПО ВТТЧ_Товары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатурыБезПартий.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТТЧ_Товары.Номенклатура КАК Номенклатура | ИЗ | ВТТЧ_Товары КАК ВТТЧ_Товары)) КАК ОстаткиНоменклатурыБезПартийОстатки | ПО ВТТЧ_Товары.Номенклатура = ОстаткиНоменклатурыБезПартийОстатки.Номенклатура | |СГРУППИРОВАТЬ ПО | ВТТЧ_Товары.Номенклатура, | ВТТЧ_Товары.Количество, | ВТТЧ_Товары.Сумма, | ВТТЧ_Товары.НоменклатураПредставление, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0), | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СебестоимостьОстаток, 0), | ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.КоличествоБезПартийОстаток, 0), | ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.СебестоимостьБезПартийОстаток, 0), | ВТТЧ_Товары.Номенклатура.ВидНоменклатуры | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток), | СУММА(КоличествоБезПартийОстаток), | МАКСИМУМ(СебестоимостьБезПартийОстаток), | МАКСИМУМ(НоменклатураВидНоменклатуры) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); // уточним параметр МоментВремени в зависимости от режима проведения Если Режим = РежимПроведенияДокумента.Оперативный Тогда МоментВремени = Неопределено; Иначе МоментВремени = МоментВремени(); КонецЕсли; Запрос.УстановитьПараметр("МоментВремени", МоментВремени); // откорректируем текст запроса по учетной политике Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОстаткиНоменклатурыОстатки.Партия.МоментВремени", "ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ") КонецЕсли; РезультатЗапроса = Запрос.Выполнить(); // 4. *** выполняем запрос и обходим группы номенклатуры: // 4.1 ставим условие по виду номенклатуры; // 4.2 контроль остатков; // 4.3 обходим детальные записи в группировке ВыборкаНоменклатура и списываем по партиям; ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // 4.1. ставим условие по виду номенклатуры (начало) Если ВыборкаНоменклатура.НоменклатураВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда СписаннаяСебестоимость = 0; КоличествоВсегоСписать = ВыборкаНоменклатура.Количество; // 4.2 контроль остатков (начало) Если КоличествоВсегоСписать > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = СтрШаблон("По номенклатуре %1 не хватает остатков в количестве %2", ВыборкаНоменклатура.НоменклатураПредставление, КоличествоВсегоСписать - ВыборкаНоменклатура.КоличествоОстаток); Сообщение.Сообщить(); // отказываем в проведении Отказ = Истина; КонецЕсли; // если не хватает, то отменяем проведение (детальные записи не обрабатываем) Если Отказ Тогда Продолжить; КонецЕсли; // (конец) 4.2 контроль остатков // 4.3 обходим детальные записи в группировке ВыборкаНоменклатура и списываем по партиям (начало) ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоВсегоСписать > 0 Цикл // списываем минимальное из... КоличествоСписать = МИН(КоличествоВсегоСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток); // решаем "проблему копеек" для ФИФО и ЛИФО Если КоличествоВсегоСписать = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда СебестоимостьСписать = ВыборкаДетальныеЗаписи.СебестоимостьОстаток; Иначе СебестоимостьСписать = КоличествоСписать/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.СебестоимостьОстаток КонецЕсли; // решаем "проблему копеек" для ПоСредней Если МетодСписания = Перечисления.УчетнаяПолитика.ПоСредней Тогда СебестоимостьСписать = КоличествоВсегоСписать/ВыборкаНоменклатура.КоличествоБезПартийОстаток*ВыборкаНоменклатура.СебестоимостьБезПартийОстаток; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Количество = КоличествоСписать; Движение.Себестоимость = СебестоимостьСписать; Движение = Движения.ОстаткиНоменклатурыБезПартий.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.КоличествоБезПартий = КоличествоСписать; Движение.СебестоимостьБезПартий = СебестоимостьСписать; КоличествоВсегоСписать = КоличествоВсегоСписать - КоличествоСписать; СписаннаяСебестоимость = СписаннаяСебестоимость + СебестоимостьСписать; КонецЦикла; // (конец) 4.3 обходим детальные записи в группировке ВыборкаНоменклатура и списываем по партиям Иначе // если услуга, то Себестоимость равна 0 СебестоимостьСписать = 0; КонецЕсли; // (конец) 4.1. ставим условие по виду номенклатуры // записываем регистр Продажи для любого вида номенклатуры Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.Количество; Движение.СуммаПродажи = ВыборкаНоменклатура.Сумма; Движение.Себестоимость = СписаннаяСебестоимость; КонецЦикла; КонецПроцедуры |
Особенности:
- В документ
РасходнаяНакладная
нужно добавить реквизитМетодСписания
, типПеречислениеСсылка.УчетнаяПолитика
(т.к. документ может проводиться неоперативно, то есть необходимость отслеживать метод списания на момент создания документа). - При создании формы на сервере обработать получение метода списания и его запись в реквизит
МетодСписания
(см. выше). - При обработке проведения не забывать о проверке на "товар - услуга" (услуги в регистр накопления
ОстаткиНоменклатуры
не пишутся, и т.д.). - Т.к. документы задним числом не вводятся, но старые документы могут перепроводиться в неоперативном режиме, то необходимо будет уточнять параметр МоментВремени.
- Сформировать движения (через конструктор, табличная часть выбирается только тогда, когда из неё заполняются измерения!) и определить методику контроля остатков:
-
- если для заполнения набора записей данные регистра не нужны – новая (если новая и приход – то контроль не нужен);
- если для заполнения набора записей данные регистра нужны - старая (если используются два регистра, то возможен вариант использования разных методик).
-
Порядок действий:
- Определить текущий метод списания себестоимости (в этой задаче он определяется для документа в процедуре формы документа ПриСозданииНаСервере() )
Код12// получаем МетодСписания// (в процедуре ПриСозданииНаСервере)[свернуть]
- Очистить движения регистров.
Код123456// очищаем движения регистров и устанавливаем флаги на записьДвижения.ОстаткиНоменклатуры.Записать();Движения.ОстаткиНоменклатурыБезПартий.Записать();Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.ОстаткиНоменклатурыБезПартий.Записывать = Истина;Движения.Продажи.Записывать = Истина;[свернуть]
- Устанавливаем на регистры блокировку:
- копируем из Синтакс-помощника;
- исправляем для обоих регистров накопления;
Код1234567891011121314// устанавливаем на регистры блокировкуБлокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");Блокировка.Заблокировать();Блокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатурыБезПартий");ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");Блокировка.Заблокировать();[свернуть]
- Получить из регистра данные для проведения:
- запросом с обработкой результатов получаем данные для проведения из табличной части и регистра накопления
ОстаткиНоменклатуры.Остатки
(с отборомВидНоменклатуры <> Услуга
):- выбираем из табличной части
Номенклатура
,Количество
,Номенклатура.Представление
,Сумма
; - группируем по
Номенклатура
(убираем возможные дубли); - суммируем по
Количество
(определяем общее количество списываемой номенклатуры для контроля остатков),Сумма
(определяем сумму продажи); - ставим условия:
Ссылка
на эту РасходнуюНакладную;- условие на
ВидНоменклатуры
при отборе ставить не будем, т.к. в регистр Продажи должны писаться не только Товары, но и Услуги;
- помещаем во временную таблицу;
- индексируем по
Номенклатура
(будем далее соединять по этому полю); - добавляем второй запрос пакета запросов для получения данных из регистра накопления
ОстаткиНоменклатуры.Остатки;
- добавляем временную таблицу, выбираем
Номенклатура
,Номенклатура.Представление
(представления нужны для вывода сообщений),Количество,
Сумма
,ВидНоменклатуры
; - добавляем регистры накопления, устанавливаем параметры виртуальной таблицы;
Рисунки[свернуть]
- выбираем из регистров
КоличествоОстаток
,СебестоимостьОстаток
,КоличествоБезПартийОстаток
,СебестоимостьБезПартийОстаток
(для контроля остатков), обернуть вЕСТЬNULL()
(т.к. левое соединение будет); - связь таблиц по номенклатуре, ЛЕВОЕ соединение;
- на вкладке "Порядок" из регистра
ОстаткиНоменклатурыОстатки
добавить полеПартия.МоментВремени
,Сортировка - Возрастание
(для ФИФО); - на вкладке "Итоги" построим иерархию для партий товаров:
- "Группировочное поле" -
Номенклатура
; - "Итоговое поле" -
СУММА(КоличествоОстаток)
из регистра,МАКСИМУМ(Количество)
из документа - именно их мы будем сравнивать при контроле остатков,МАКСИМУМ(Сумма)
- сумма продажи,МАКСИМУМ(НоменклатураВидНоменклатуры)
;Рисунок[свернуть]
- "Группировочное поле" -
- закрываем конструктор запросов.
- выбираем из табличной части
-
откорректируем текст запроса по учетной политике (ФИФО или ЛИФО);Код12345// откорректируем текст запроса по учетной политикеЕсли МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО ТогдаЗапрос.Текст = СтрЗаменить(Запрос.Текст, "ОстаткиНоменклатурыОстатки.Партия.МоментВремени","ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ")КонецЕсли;[свернуть]
- устанавливаем параметры запроса:
-
МоментВремени (в зависимости от режима проведения)12345678// уточним параметр МоментВремени в зависимости от режима проведенияЕсли Режим = РежимПроведенияДокумента.Оперативный ТогдаМоментВремени = Неопределено;ИначеМоментВремени = МоментВремени();КонецЕсли;Запрос.УстановитьПараметр("МоментВремени", МоментВремени);[свернуть]
Ссылка
какСсылка();
Код запроса к этому моменту12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление КАК НоменклатураПредставление|ПОМЕСТИТЬ ВТТЧ_Товары|ИЗ| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры|ГДЕ| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка||СГРУППИРОВАТЬ ПО| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| ВТТЧ_Товары.Номенклатура КАК Номенклатура,| ВТТЧ_Товары.Количество КАК Количество,| ВТТЧ_Товары.Сумма КАК Сумма,| ВТТЧ_Товары.НоменклатураПредставление КАК НоменклатураПредставление,| ОстаткиНоменклатурыОстатки.Партия КАК Партия,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СебестоимостьОстаток, 0) КАК СебестоимостьОстаток,| ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.КоличествоБезПартийОстаток, 0) КАК КоличествоБезПартийОстаток,| ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.СебестоимостьБезПартийОстаток, 0) КАК СебестоимостьБезПартийОстаток,| ВТТЧ_Товары.Номенклатура.ВидНоменклатуры КАК НоменклатураВидНоменклатуры|ИЗ| ВТТЧ_Товары КАК ВТТЧ_Товары| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (ВЫБРАТЬ| ВТТЧ_Товары.Номенклатура КАК Номенклатура| ИЗ| ВТТЧ_Товары КАК ВТТЧ_Товары)) КАК ОстаткиНоменклатурыОстатки| ПО ВТТЧ_Товары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатурыБезПартий.Остатки(| &МоментВремени,| Номенклатура В| (ВЫБРАТЬ| ВТТЧ_Товары.Номенклатура КАК Номенклатура| ИЗ| ВТТЧ_Товары КАК ВТТЧ_Товары)) КАК ОстаткиНоменклатурыБезПартийОстатки| ПО ВТТЧ_Товары.Номенклатура = ОстаткиНоменклатурыБезПартийОстатки.Номенклатура||СГРУППИРОВАТЬ ПО| ВТТЧ_Товары.Номенклатура,| ВТТЧ_Товары.Количество,| ВТТЧ_Товары.Сумма,| ВТТЧ_Товары.НоменклатураПредставление,| ОстаткиНоменклатурыОстатки.Партия,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0),| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СебестоимостьОстаток, 0),| ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.КоличествоБезПартийОстаток, 0),| ЕСТЬNULL(ОстаткиНоменклатурыБезПартийОстатки.СебестоимостьБезПартийОстаток, 0),| ВТТЧ_Товары.Номенклатура.ВидНоменклатуры||УПОРЯДОЧИТЬ ПО| ОстаткиНоменклатурыОстатки.Партия.МоментВремени|ИТОГИ| МАКСИМУМ(Количество),| МАКСИМУМ(Сумма),| СУММА(КоличествоОстаток),| СУММА(КоличествоБезПартийОстаток),| МАКСИМУМ(СебестоимостьБезПартийОстаток),| МАКСИМУМ(НоменклатураВидНоменклатуры)|ПО| Номенклатура";Запрос.УстановитьПараметр("Ссылка", Ссылка);// уточним параметр МоментВремени в зависимости от режима проведенияЕсли Режим = РежимПроведенияДокумента.Оперативный ТогдаМоментВремени = Неопределено;ИначеМоментВремени = МоментВремени();КонецЕсли;Запрос.УстановитьПараметр("МоментВремени", МоментВремени);// откорректируем текст запроса по учетной политикеЕсли МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО ТогдаЗапрос.Текст = СтрЗаменить(Запрос.Текст, "ОстаткиНоменклатурыОстатки.Партия.МоментВремени","ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ")КонецЕсли;РезультатЗапроса = Запрос.Выполнить();[свернуть]
-
- выполняем запрос и обходим группы номенклатуры;
Код123456789101112131415161718192021222324РезультатЗапроса = Запрос.Выполнить();ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);Пока ВыборкаНоменклатура.Следующий() Цикл// для суммирования списанной себестоимости по номенклатуре для заполнения Стоимости регистра ПродажиСписаннаяСебестоимость = 0;// если услуга, то записываем только регистр ПродажиЕсли ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда// здесь будет код обхода ВыборкаНоменклатура (контроль остатков по общему количеству к списанию)// здесь будет код обхода детальных записей (из ВыборкаНоменклатура)Иначе// если услуга, то Себестоимость равна 0СебестоимостьСписать = 0;КонецЕсли;// здесь будет запись движений регистра ПродажиКонецЦикла;[свернуть]
- выполняем контроль остатков по сгруппированным в ИТОГАХ номенклатурным позициям (детальные записи при нехватке обходить смысла нет);
Код1234567891011121314151617// 4.2 контроль остатков (начало)Если КоличествоВсегоСписать > ВыборкаНоменклатура.КоличествоОстаток ТогдаСообщение = Новый СообщениеПользователю;Сообщение.Текст = СтрШаблон("По номенклатуре %1 не хватает остатков в количестве %2",ВыборкаНоменклатура.НоменклатураПредставление,КоличествоВсегоСписать - ВыборкаНоменклатура.КоличествоОстаток);Сообщение.Сообщить();// отказываем в проведенииОтказ = Истина;КонецЕсли;// если не хватает, то отменяем проведение (детальные записи не обрабатываем)Если Отказ ТогдаПродолжить;КонецЕсли; // (конец) 4.2 контроль остатков[свернуть]
- списываем номенклатуру по партиям с контролем "проблемы копеек" и записываем движения в регистр
ОстаткиНоменклатуры
(только, если не Услуга);Код1234567891011121314151617181920212223242526272829303132333435363738394041424344454647// 4.3 обходим детальные записи в группировке ВыборкаНоменклатура и списываем по партиям (начало)ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоВсегоСписать > 0 Цикл// списываем минимальное из...КоличествоСписать = МИН(КоличествоВсегоСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);// решаем "проблему копеек" для ФИФО и ЛИФОЕсли КоличествоВсегоСписать = ВыборкаДетальныеЗаписи.КоличествоОстаток ТогдаСебестоимостьСписать = ВыборкаДетальныеЗаписи.СебестоимостьОстаток;ИначеСебестоимостьСписать = КоличествоСписать/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.СебестоимостьОстатокКонецЕсли;// решаем "проблему копеек" для ПоСреднейЕсли МетодСписания = Перечисления.УчетнаяПолитика.ПоСредней ТогдаСебестоимостьСписать = КоличествоВсегоСписать/ВыборкаНоменклатура.КоличествоБезПартийОстаток*ВыборкаНоменклатура.СебестоимостьБезПартийОстаток;КонецЕсли;Движение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;Движение.Партия = ВыборкаДетальныеЗаписи.Партия;Движение.Количество = КоличествоСписать;Движение.Себестоимость = СебестоимостьСписать;Движение = Движения.ОстаткиНоменклатурыБезПартий.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;Движение.КоличествоБезПартий = КоличествоСписать;Движение.СебестоимостьБезПартий = СебестоимостьСписать;КоличествоВсегоСписать = КоличествоВсегоСписать - КоличествоСписать;СписаннаяСебестоимость = СписаннаяСебестоимость + СебестоимостьСписать;КонецЦикла; // (конец) 4.3 обходим детальные записи в группировке ВыборкаНоменклатура и списываем по партиямИначе// если услуга, то Себестоимость равна 0СебестоимостьСписать = 0;КонецЕсли; // (конец) 4.1. ставим условие по виду номенклатуры[свернуть] - записываем движения в регистр Продажи и взводим флаги на запись;
Код1234567// записываем регистр Продажи для любого вида номенклатурыДвижение = Движения.Продажи.Добавить();Движение.Период = Дата;Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;Движение.Количество = ВыборкаНоменклатура.Количество;Движение.СуммаПродажи = ВыборкаНоменклатура.Сумма;Движение.Себестоимость = СписаннаяСебестоимость;[свернуть]
- запросом с обработкой результатов получаем данные для проведения из табличной части и регистра накопления
- Завести пользовательские данные в режиме 1С Предприятие, провести документ, проверить движения (добавить ссылку на соответствующий регистр в форму документа: (три верикальные точки) – Окно – Настройка панели навигации формы).
[свернуть]
Например, создадим отчет следующего вида:
- Создать новый отчет
ПродажиЗаПериод
, разместить в нужной подсистеме (например, ОУ). - Добавить новый
НаборДанных-запрос
. - В конструкторе запроса:
- добавить таблицу регистр
ПродажиОбороты
; - выбрать из него поля
Номенклатура
,КоличествоОборот
,СебестоимостьОборот
,СуммаПродажиОборот
(для удобства можно переименовать, убрав ...Оборот
); - в параметрах виртуальной таблицы регистра
ПродажиОбороты
указать параметры&НачалоПериода
и&КонецПериода
;
- добавить таблицу регистр
- На вкладке Вычисляемые поля добавить вычисляемое поле
Прибыль
, которое рассчитывается как«Сумма продаж» – «Себестоимость»
(поле Выражение), установить соответствующий заголовок. - Добавить ресурсы (все).
- На вкладке Параметры добавить СтандартныйПериод ;
Рисунок[свернуть]
- На вкладке Настройки :
- добавить в отчет:
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
Заголовок
(здесь будем выводить текст "Продажи за период...");- внизу выбрать
<Детальные записи> (Заголовок)
, перейти на вкладку Другие настройки - (в самый низ) -Вариант использования группировки
- выбратьДополнительная информация
;
- внизу выбрать
- новую группировку (детальные записи, не выбирая поле), без иерархии;
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
- внизу выбрать
Отчет
, перейти на вкладку Другие настройки :Макет оформления - Античный
;Расположение общих итогов по горизонтали (и по вертикали) - Нет
;Выводить параметры
- выбратьНе выводить
;
- добавить в отчет:
- вверху на вкладке Макеты добавить заголовок (как в задании):
-
- добавить макет группировки, выбрать группировку
Заголовок
; - в табличном документе в ячейке размещаем текст заголовка из задания с параметрами ("Продажи за период с [НачалоПериода] по [КонецПериода]"), форматируем шрифт как в задании, в свойствах ячейки меняем заполнение на
Шаблон
, связываем эту ячейку с макетомЗаголовок
в полеОбласть
; - связываем параметры
[НачалоПериода]
и[КонецПериода]
шаблона с соответствующими параметрами отчета (в полеПараметрыДанных
); - форматируем вывод даты в свойствах ячейки (
Формат - Дата
) как в задании.
- добавить макет группировки, выбрать группировку
-
- возвращаемся на вкладку Настройки, далее - вниз, "Настройки: Отчет":
- Параметры:
Период - Произвольный период
, указываем дату начала и дату окончания как в шапке отчета, устанавливаем флаг "Включать в пользовательские настройки";Рисунок[свернуть][/spoiler2]
- Выбранные поля -
Номенклатура
; - устанавливаем выравнивание в ячейках по центру: Условное оформление, в колонках:
Оформление - Горизонтальное положение
,Оформляемые поля
- выбрать все (кроме Номенклатура),Область использования - Везде
;
- Параметры:
Окончательно внешний вид отчета (например, выравнивание в колонках для шапки таблицы и данных в колонках) также настраивается в режиме Предприятие через меню "Ещё" - "Изменить вариант" - "Условное оформление".
Например, создадим отчет следующего вида:
- Создать новый отчет
ОтчетПоЗадачеОУ3_1
, разместить в нужной подсистеме (например, ОУ). - Вкладка Наборы данных - добавить новый
НаборДанных-запрос
. - В конструкторе запроса:
- добавить таблицу регистр
ОстаткиНоменклатурыОстатки
; - в параметрах виртуальной таблицы регистра
ОстаткиНоменклатурыОстатки
указать параметр Период -&МоментВремени
,Использование - Всегда
(уберет поле флажка в отчете); - выбрать из регистра поля
Номенклатура
,Партия
,СебестоимостьОстаток
,КоличествоОстаток
(для удобства можно переименовать, убрав ...Остаток
);
- добавить таблицу регистр
- На вкладке Порядок конструктора запроса:
- добавить поля
Номенклатура,
Партия
, в колонкеСортировка – Возрастание
;
- добавить поля
- Вернуться на вкладку Наборы данных, установить именования полей таблицы согласно рисунку, а также выражение представления для вывода текста "Прих. накладная №..."
"Прих. накладная № " + Партия.Номер
(номер будет выводиться с лидирующими нулями, если нужен сокращенный номер, то его можно установить в накладной);Рисунок[свернуть] - Вкладка Ресурсы - добавляем ресурсы
Количество
иСебестоимость
(т.к. нужно будет суммировать по группировке Номенклатура). - На вкладке Параметры добавить
МоментВремени
, тип Дата (можно использовать и стандартныйПериод
, но нужно тогда изменить настройки регистра); - На вкладке Настройки :
- добавить в отчет:
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
Заголовок
(здесь будем выводить текст "Продажи за период...");- внизу выбрать
<Детальные записи> (Заголовок)
, перейти на вкладку Другие настройки - (в самый низ) -Вариант использования группировки
- выбратьДополнительная информация
;
- внизу выбрать
- новую группировку
Номенклатура
, без иерархии, выбранные поля -Номенклатура
,Количество
,Стоимость
(выведет суммы в строке группировки); - новую группировку (детальные записи, не выбирая поле), без иерархии, подчинить группировке
Номенклатура
, выбрать поляПартия
,Количество
,Стоимость
;
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
- внизу выбрать
Отчет
, перейти на вкладку Другие настройки :Выводить параметры
- выбратьНе выводить
;Макет оформления - Античный
;Расположение общих итогов по горизонтали (и по вертикали) - Нет
;Расположение полей группировок - Отдельно и только в итогах
(выведет полеНоменклатура
в отчете как отдельное);
- добавить в отчет:
- вверху на вкладке Макеты добавить заголовок (как в задании):
-
- добавить макет группировки, выбрать группировку
Заголовок
; - в табличном документе в ячейке размещаем текст заголовка из задания с параметрами ("Остатки товаров на [МоментВремени]"), форматируем шрифт как в задании, в свойствах ячейки меняем заполнение на
Шаблон
, связываем эту ячейку с макетомЗаголовок
в полеОбласть
; - связываем параметр
[МоментВремени]
шаблона с соответствующими параметрами отчета (в полеПараметрыДанных
); - форматируем вывод даты в свойствах ячейки (Формат - Дата) как в задании.
- добавить макет группировки, выбрать группировку
-
- возвращаемся на вкладку Настройки, далее - вниз, "Настройки: Отчет":
- Параметры:
МоментВремени
, указываем дату как в шапке отчета, устанавливаем флаг "Включать в пользовательские настройки"; - Выбранные поля - все выбрать ;
- устанавливаем Условное оформление, как на рисунке из задания:
- меняем шрифт заголовка (группировка Дополнительная информация) ;
- для группировки
Номенклатура
меняем цвет фона и устанавливаем полужирный шрифт в группировке; - для детальных записей устанавливаем шрифт;
- для всего отчета - цвет текста, горизонтальное и вертикальное выравнивание, шрифт и отступ (при необходимости).
- Параметры:
- При желании можно сразу изменить именование варианта (представление).