(за правильность не ручаюсь, буду благодарен за замечания)
- Складской учет не ведется.
- Услуги и товары - в одной табличной части.
- Списание себестоимости товаров - по партиям, в зависимости от текущего значения принятого на этот год в учетной политике компании метода списания себестоимости (FIFO или LIFO) и указанной в документе (в табличной части документа) партии. Порядок списания:
- в первую очередь должен списываться товар из указанной в табличной части партии;
- если товара по указанной партии не хватает (или его нет), то товар списывается в соответствии с текущей учетной политикой.
- При проведении расходной накладной при нехватке товара программа должна выдавать предупреждение с указанием количества «нехватки» и не позволять проводить такой документ.
[свернуть]
- Включить возможность использования обычных форм (нужно для Консоли запросов):
- Сервис – Параметры – флаг «Управляемое приложение и обычное приложение»;
- свойства конфигурации – флаг «Использовать обычные формы в управляемом приложении»;
- Настройка конфигурации (свойства):
- свойства конфигурации – Режим управления блокировкой данных - Управляемый;
- добавить кнопку запуска отладки под Толстым клиентом (эта обработка Консоль запросов запускается только под ним).
- Создать Подсистемы (порядок – согласно порядку задачи: <конфигурация> – пкм – Открыть командный интерфейс):
- Оперативный учет;
- Бухгалтерский учет;
- Расчеты;
- Бизнес-процессы (или Управляемые формы) – по задаче;
- Сервис.
- Упорядочить подсистемы можно в режиме 1С Предприятие (Настройки – Настройка панели разделов).
- В созданные подсистемы (Подсистемы – пкм – Все подсистемы) добавить те объекты, которые должны в них входить (отображаться в интерфейсе):
- Создать Группы команд:
- Справочники;
- Документы;
- ПланыВидовХарактеристик;
- РегистрыСведений;
- РегистрыОУ;
- РегистрыБУ;
- РегистрыСПР.
- Например, подсистема "Оперативный учет" может включать:
- Справочник Номенклатура;
- Документ Приходная накладная;
- Документ Расходная накладная;
- Регистр накопления Остатки номенклатуры и т.д.
- Создать Группы команд:
- Распределить объекты подсистем по соответствующим группам команд.
- Настроить интерфейс клиентского приложения (<конфигурация> – пкм – Открыть интерфейс клиентского приложения):
- Сверху убрать Панель функций текущего раздела, добавить Панель открытых;
- Слева – Панель разделов.
- Включить возможность использования Консоли запросов (запускается только под Толстым клиентом):
- В модуле формы консоли изменить обработку исключения
Предупреждение(Сред(ОписаниеОшибки(),69));
наПоказатьПредупреждение(,Сред(ОписаниеОшибки(),69))
;
- В модуле формы консоли изменить обработку исключения
- Определяем список документов, используемых в решении. Все они явно описаны в задании, свои не добавлять.
- Если в условии упоминаются услуги, то сразу готовим конфигурацию:
- проверяем (создаем)
Перечисления.ВидыНоменклатуры
со значениямиТовар
,Услуга
; - в справочник Номенклатура добавляем реквизит
ВидНоменклатуры
, типПеречислениеСсылка.ВидыНоменклатуры
;
- проверяем (создаем)
- Пропускаем: Если в условии упоминается учетная политика (ФИФО, ЛИФО, средняя), то сразу готовим конфигурацию:
- проверяем (создаем)
Перечисления.УчетнаяПолитика
со значениямиФИФО
, ЛИФО, Средняя; - создать регистр сведений (периодический)
УчетнаяПолитика
(по нему будем определять метод учетной политики на дату документа):- периодичность - по заданию (например,
В пределах года
); - режим записи -
Независимый
; - добавить его в подсистему (например, ОУ);
- вкладка "Данные" - добавить ресурс
МетодСписанияСебестоимости
с типомПеречислениеСсылка.УчетнаяПолитика
.
- периодичность - по заданию (например,
- проверяем (создаем)
- Пропускаем: Если ведется складской учет, то сразу готовим конфигурацию:
- добавляем справочник
Склады
; - в регистры накопления добавить измерение
Склад
, типСправочникСсылка.Склады
;
- добавляем справочник
- (При желании, сэкономит время на правильный ввод данных в документы) Настроить автоподсчет сумм (строка и документ) в Приходной и Расходной накладных (общий модуль + модули форм документов, в свойствах общего модуля проверить флаги «Клиент», «Сервер»):
- при изменении в строке табличной части
Количество
иЦена
; - при удалении или добавлении копированием.
- при изменении в строке табличной части
Это не обязательно. Процедуры можно создать для одного документа, а в модуль второго просто скопировать, назначив затем в свойствах формы для событий элементов табличной части СписокНоменклатуры
.
Создать общий модуль РаботаСДокументами
:
-
- не забыть
Экспорт
; - установить флаг "Клиент (управляемое приложение)":
- не забыть
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 |
&НаКлиенте Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент) ТекДанные = Элементы.СписокНоменклатуры.ТекущиеДанные; РаботаСДокументами.СуммаПоСтроке(ТекДанные); Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры &НаКлиенте Процедура СписокНоменклатурыЦенаПриИзменении(Элемент) ТекДанные = Элементы.СписокНоменклатуры.ТекущиеДанные; РаботаСДокументами.СуммаПоСтроке(ТекДанные); Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры &НаКлиенте Процедура СписокНоменклатурыСуммаПриИзменении(Элемент) ТекДанные = Элементы.СписокНоменклатуры.ТекущиеДанные; РаботаСДокументами.ЦенаПоСумме(ТекДанные); Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры // Для подсчета суммы по документу при копировании строки &НаКлиенте Процедура СписокНоменклатурыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если Копирование Тогда Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецЕсли; КонецПроцедуры // Для подсчета суммы по документу при удалении строки &НаКлиенте Процедура СписокНоменклатурыПослеУдаления(Элемент) Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры |
Общий алгоритм:
- Определить количество ресурсов – по накапливаемым данным, из отчета (количество, сумма, себестоимость, сумма продажи и т.д.). Добавить в соответствующий регистр, проверив соответствие типа, длины и точности.
- Определить количество измерений – по детализации ресурсов (склад, партия, контрагент, номенклатура и т.д.). Добавить соответствующие измерения.
- Проверить установку флага «Запрет незаполненных значений» (при необходимости).
- Регистр накопления:
- Прочее - флаг «Разрешить разделение итогов» - включить.
Проанализируем условие задачи и таблицы из условия:
Необходимо построить отчеты по продажам товаров за период и остаткам товара на указанную дату. Колонки "Прибыль", "Интервал" и "Срок" в отчете будут содержать вычисляемые данные.
Т.о. нам понадобятся 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 |
Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | И ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры = &ВидНоменклатуры | |СГРУППИРОВАТЬ ПО | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ВидНоменклатуры", Перечисления.ВидыНоменклатуры.Товар); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ВыборкаДетальныеЗаписи.Количество; Движение.Себестоимость = ВыборкаДетальныеЗаписи.Сумма; КонецЦикла; Движения.ОстаткиНоменклатуры.Записывать = ИСТИНА; КонецПроцедуры |
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 |
Процедура ОбработкаПроведения(Отказ, Режим) // метод списания МетодСписания = РегистрыСведений.МетодСписания.ПолучитьПоследнее(Дата).МетодСписания; Если НЕ ЗначениеЗаполнено(МетодСписания) Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не заполнен метод списания себестоимости."; Сообщение.Сообщить(); КонецЕсли; // удаление движений Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; // блокировки Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); // запрос //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КоличествоДок, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК СуммаДок, | РасходнаяНакладнаяСписокНоменклатуры.Партия КАК Партия, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление КАК НоменклатураПредставление |ПОМЕСТИТЬ ВТ_Товары |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Партия, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_Товары.Номенклатура КАК Номенклатура, | ВТ_Товары.КоличествоДок КАК Количество, | ВТ_Товары.СуммаДок КАК Сумма, | ВТ_Товары.НоменклатураПредставление КАК НоменклатураПредставление, | ВТ_Товары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СебестоимостьОстаток, 0) КАК СебестоимостьОстаток, | ВЫБОР | КОГДА ВТ_Товары.Партия = ОстаткиНоменклатурыОстатки.Партия | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК ПартияПорядок, | ОстаткиНоменклатурыОстатки.Партия КАК Партия |ИЗ | ВТ_Товары КАК ВТ_Товары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ_Товары.Номенклатура КАК Номенклатура | ИЗ | ВТ_Товары КАК ВТ_Товары)) КАК ОстаткиНоменклатурыОстатки | ПО ВТ_Товары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПартияПорядок, | ОстаткиНоменклатурыОстатки.Партия.МоментВремени |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст,"ОстаткиНоменклатурыОстатки.Партия.МоментВремени", "ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ"); КонецЕсли; РезультатЗапроса = Запрос.Выполнить(); ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура СписаннаяСебестоимость = 0; //Проверяем остатки Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = СтрШаблон("По номенклатуре %1 не хватает товара в количестве %2 ед.", ВыборкаНоменклатура.Номенклатура, ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток) ; Сообщение.Сообщить(); КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоВсегоСписать = ВыборкаНоменклатура.Количество; Выборка = ВыборкаНоменклатура.Выбрать(); Пока Выборка.Следующий() Цикл КоличествоСписать = МИН(КоличествоВсегоСписать,Выборка.КоличествоОстаток); Если КоличествоВсегоСписать = Выборка.КоличествоОстаток Тогда СебестоимостьСписать = Выборка.СебестоимостьОстаток; Иначе СебестоимостьСписать = КоличествоСписать / Выборка.КоличествоОстаток * Выборка.СебестоимостьОстаток; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Партия = Выборка.Партия; Движение.Количество = КоличествоСписать; Движение.Себестоимость = СебестоимостьСписать; КоличествоВсегоСписать = КоличествоВсегоСписать - КоличествоСписать; СписаннаяСебестоимость = СписаннаяСебестоимость + СебестоимостьСписать; КонецЦикла; Иначе СебестоимостьСписать = 0; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.Количество; Движение.Стоимость = СписаннаяСебестоимость; Движение.СуммаПродажи = ВыборкаНоменклатура.Сумма; КонецЦикла; КонецПроцедуры |
Особенности:
- При обработке проведения не забывать о проверке на "товар - услуга" (услуги в регистр накопления
ОстаткиНоменклатуры
не пишутся, и т.д.). - Сформировать движения (через конструктор, табличная часть выбирается только тогда, когда из неё заполняются измерения!) и определить методику контроля остатков:
-
- если для заполнения набора записей данные регистра не нужны – новая (если новая и приход – то контроль не нужен);
- если для заполнения набора записей данные регистра нужны - старая (если используются два регистра, то возможен вариант использования разных методик).
-
Порядок действий:
- Определить текущий метод списания себестоимости.
Код123456789101112// метод списанияМетодСписания = РегистрыСведений.МетодСписания.ПолучитьПоследнее(Дата).МетодСписания;Если НЕ ЗначениеЗаполнено(МетодСписания) ТогдаОтказ = Истина;Сообщение = Новый СообщениеПользователю;Сообщение.Текст = "Не заполнен метод списания себестоимости.";Сообщение.Сообщить();КонецЕсли;[свернуть]
- Очистить движения регистров.
Код12345// очищаем движения, взводим флаги на записьДвижения.ОстаткиНоменклатуры.Записывать = Истина;Движения.ОстаткиНоменклатуры.Записать();Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Продажи.Записывать = Истина;[свернуть]
- Устанавливаем на регистры блокировку:
- копируем из Синтакс-помощника;
- меняем данные;
Код1234567// ставим блокировкуБлокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");Блокировка.Заблокировать();[свернуть]
- Получить из регистра данные для проведения:
- запросом с обработкой результатов получаем данные для проведения из табличной части и регистра накопления
ОстаткиНоменклатуры.Остатки
:- выбираем из табличной части
Номенклатура
,Количество
,Номенклатура.Представление
,Номенклатура.ВидНоменклатуры
,Сумма
; - группируем по
Номенклатура
,Партия
(убираем возможные дубли); - суммируем по
Количество
(определяем общее количество списываемой номенклатуры для контроля остатков),Сумма
(определяем сумму продажи); - ставим условия:
Ссылка
на эту РасходнуюНакладную;- условие на
ВидНоменклатуры
при отборе ставить не будем, т.к. в регистр Продажи должны писаться не только Товары, но и Услуги;
- помещаем во временную таблицу;
- индексируем по
Номенклатура
(будем далее соединять по этому полю); - добавляем второй запрос пакета запросов для получения данных из регистра накопления
ОстаткиНоменклатуры.Остатки;
- добавляем временную таблицу, выбираем
Номенклатура
,Номенклатура.Представление
(представления нужны для вывода сообщений),Количество,
Сумма
,ВидНоменклатуры
; - добавляем регистр накопления, устанавливаем параметры виртуальной таблицы;
Рисунки[свернуть]
- выбираем из регистра
КоличествоОстаток
,СебестоимостьОстаток
(для контроля остатков), обернуть вЕСТЬNULL()
(т.к. левое соединение); - связь таблиц по номенклатуре, ЛЕВОЕ соединение;
- закрываем конструктор запросов.
- выбираем из табличной части
- устанавливаем параметры запроса:
МоментВремени
какМоментВремени();
Ссылка
какСсылка;
Код запроса1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162// получаем данные из документа и регистраЗапрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КоличествоДок,| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК СуммаДок,| РасходнаяНакладнаяСписокНоменклатуры.Партия КАК Партия,| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление КАК НоменклатураПредставление|ПОМЕСТИТЬ ВТ_Товары|ИЗ| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры|ГДЕ| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка||СГРУППИРОВАТЬ ПО| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,| РасходнаяНакладнаяСписокНоменклатуры.Партия,| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление||ИНДЕКСИРОВАТЬ ПО| Номенклатура|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| ВТ_Товары.Номенклатура КАК Номенклатура,| ВТ_Товары.КоличествоДок КАК Количество,| ВТ_Товары.СуммаДок КАК Сумма,| ВТ_Товары.НоменклатураПредставление КАК НоменклатураПредставление,| ВТ_Товары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СебестоимостьОстаток, 0) КАК СебестоимостьОстаток,| ВЫБОР| КОГДА ВТ_Товары.Партия = ОстаткиНоменклатурыОстатки.Партия| ТОГДА 0| ИНАЧЕ 1| КОНЕЦ КАК ПартияПорядок,| ОстаткиНоменклатурыОстатки.Партия КАК Партия|ИЗ| ВТ_Товары КАК ВТ_Товары| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (ВЫБРАТЬ| ВТ_Товары.Номенклатура КАК Номенклатура| ИЗ| ВТ_Товары КАК ВТ_Товары)) КАК ОстаткиНоменклатурыОстатки| ПО ВТ_Товары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура||УПОРЯДОЧИТЬ ПО| ПартияПорядок,| ОстаткиНоменклатурыОстатки.Партия.МоментВремени|ИТОГИ| МАКСИМУМ(Количество),| МАКСИМУМ(Сумма),| СУММА(КоличествоОстаток)|ПО| Номенклатура";Запрос.УстановитьПараметр("Ссылка", Ссылка);Запрос.УстановитьПараметр("МоментВремени", МоментВремени());[свернуть]
- откорректируем текст запроса по учетной политике (ФИФО или ЛИФО);
Код1234567// корректируем запрос в соответствии с действующим методом списания себестоимостиЕсли МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО ТогдаЗапрос.Текст = СтрЗаменить(Запрос.Текст, "ОстаткиНоменклатурыОстатки.Партия.МоментВремени","ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ");КонецЕсли;[свернуть]
- выполняем запрос и обходим детальные записи;
Код12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667РезультатЗапроса = Запрос.Выполнить();ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);Пока ВыборкаНоменклатура.Следующий() Цикл// Вставить обработку выборки ВыборкаНоменклатураСписаннаяСебестоимость = 0;//Проверяем остаткиЕсли ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар ТогдаЕсли ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток ТогдаОтказ = Истина;Сообщение = Новый СообщениеПользователю;Сообщение.Текст = СтрШаблон("По номенклатуре %1 не хватает товара в количестве %2 ед.",ВыборкаНоменклатура.Номенклатура,ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток) ;Сообщение.Сообщить();КонецЕсли;Если Отказ ТогдаПродолжить;КонецЕсли;КоличествоВсегоСписать = ВыборкаНоменклатура.Количество;Выборка = ВыборкаНоменклатура.Выбрать();Пока Выборка.Следующий() ЦиклКоличествоСписать = МИН(КоличествоВсегоСписать,Выборка.КоличествоОстаток);Если КоличествоВсегоСписать = Выборка.КоличествоОстаток ТогдаСебестоимостьСписать = Выборка.СебестоимостьОстаток;ИначеСебестоимостьСписать = КоличествоСписать / Выборка.КоличествоОстаток * Выборка.СебестоимостьОстаток;КонецЕсли;Движение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура = Выборка.Номенклатура;Движение.Партия = Выборка.Партия;Движение.Количество = КоличествоСписать;Движение.Себестоимость = СебестоимостьСписать;КоличествоВсегоСписать = КоличествоВсегоСписать - КоличествоСписать;СписаннаяСебестоимость = СписаннаяСебестоимость + СебестоимостьСписать;КонецЦикла;ИначеСебестоимостьСписать = 0;КонецЕсли;Движение = Движения.Продажи.Добавить();Движение.Период = Дата;Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;Движение.Количество = ВыборкаНоменклатура.Количество;Движение.Стоимость = СписаннаяСебестоимость;Движение.СуммаПродажи = ВыборкаНоменклатура.Сумма;КонецЦикла;[свернуть]
- запросом с обработкой результатов получаем данные для проведения из табличной части и регистра накопления
- Завести пользовательские данные в режиме 1С Предприятие, провести документ, проверить движения (добавить ссылку на соответствующий регистр в форму документа: (три верикальные точки) – Окно – Настройка панели навигации формы).
[свернуть]
Например, создадим отчет следующего вида:
- Создать новый отчет
ПродажиЗаПериод
, разместить в нужной подсистеме (например, ОУ). - Добавить новый
НаборДанных-запрос
. - В конструкторе запроса:
- добавить таблицу регистр
ПродажиОбороты
; - в параметрах виртуальной таблицы регистра
ПродажиОбороты
указать параметры&НачалоПериода
и&КонецПериода
); - выбрать из регистра поля
Номенклатура
,КоличествоОборот
,СтоимостьОборот
,СуммаПродажиОборот
(для удобства можно переименовать, убрав ...Оборот
);
- добавить таблицу регистр
- На вкладке Вычисляемые поля:
- добавить вычисляемое поле
Прибыль
, которое рассчитывается как«Сумма продаж» – «Себестоимость»
(поле Выражение), установить соответствующий заголовок;
- добавить вычисляемое поле
- Добавить ресурсы (все).
- На вкладке Настройки :
- добавить в отчет:
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
Заголовок
(здесь будем выводить текст "Продажи за период...");- внизу выбрать
<Детальные записи> (Заголовок)
, перейти на вкладку Другие настройки - (в самый низ) -Вариант использования группировки
- выбратьДополнительная информация
;
- внизу выбрать
- новую группировку
Номенклатура
, без иерархии;
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
- внизу выбрать
Отчет
, перейти на вкладку Другие настройки :Выводить параметры
- выбратьНе выводить
;Макет оформления - Античный
;Расположение общих итогов по горизонтали (и по вертикали) - Нет
;
- добавить в отчет:
- вверху на вкладке Макеты добавить заголовок (как в задании):
-
- добавить макет группировки, выбрать группировку
Заголовок
; - в табличном документе в ячейке размещаем текст заголовка из задания с параметрами ("Продажи за период с [НачалоПериода] по [КонецПериода]"), форматируем шрифт как в задании, в свойствах ячейки меняем заполнение на
Шаблон
, связываем эту ячейку с макетомЗаголовок
в полеОбласть
; - связываем параметры
[НачалоПериода]
и[КонецПериода]
шаблона с соответствующими параметрами отчета (в полеПараметрыДанных
); - форматируем вывод даты в свойствах ячейки (Формат - Дата) как в задании.
- добавить макет группировки, выбрать группировку
-
- возвращаемся на вкладку Настройки, далее - вниз, "Настройки: Отчет":
- Параметры:
Период - Произвольный период
, указываем дату начала и дату окончания как в шапке отчета, устанавливаем флаг "Включать в пользовательские настройки";Рисунок[свернуть] - Выбранные поля для группировки
Номенклатура
- все; - устанавливаем выравнивание в ячейках по центру: Условное оформление, в колонках:
Оформление - Горизонтальное положение
,Оформляемые поля
- выбрать все (кроме Номенклатура),Область использования - Везде
;
- Параметры:
Окончательно внешний вид отчета (например, выравнивание в колонках для шапки таблицы и данных в колонках) также настраивается в режиме Предприятие через меню "Ещё" - "Изменить вариант" - "Условное оформление".
Например, создадим отчет следующего вида:
- Создать новый отчет
ОтчетПоЗадачеОУ3_1
, разместить в нужной подсистеме (например, ОУ). - Вкладка Наборы данных - добавить новый
НаборДанных-запрос
. - В конструкторе запроса:
- добавить таблицу регистр
ОстаткиНоменклатурыОстатки
; - в параметрах виртуальной таблицы регистра
ОстаткиНоменклатурыОстатки
указать параметр Период -&МоментВремени
,Использование - Всегда
(уберет поле флажка в отчете); - выбрать из регистра поля
Номенклатура
,Партия
,СебестоимостьОстаток
,КоличествоОстаток
(для удобства можно переименовать, убрав ...Остаток
);
- добавить таблицу регистр
- На вкладке Порядок конструктора запроса:
- добавить поля
Номенклатура,
Партия
, в колонкеСортировка – Возрастание
;
- добавить поля
- Вернуться на вкладку Наборы данных, установить именования полей таблицы согласно рисунку, а также выражение представления для вывода текста "Прих. накладная №..."
"Прих. накладная № " + Партия.Номер
(номер будет выводиться с лидирующими нулями, если нужен сокращенный номер, то его можно установить в накладной);Рисунок[свернуть] - Вкладка Ресурсы - добавляем ресурсы
Количество
иСебестоимость
(т.к. нужно будет суммировать по группировке Номенклатура). - На вкладке Параметры добавить
МоментВремени
, тип Дата (можно использовать и стандартныйПериод
, но нужно тогда изменить настройки регистра); - На вкладке Настройки :
- добавить в отчет:
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
Заголовок
(здесь будем выводить текст "Продажи за период...");- внизу выбрать
<Детальные записи> (Заголовок)
, перейти на вкладку Другие настройки - (в самый низ) -Вариант использования группировки
- выбратьДополнительная информация
;
- внизу выбрать
- новую группировку
Номенклатура
, без иерархии, выбранные поля -Номенклатура
,Количество
,Стоимость
(выведет суммы в строке группировки); - новую группировку (детальные записи, не выбирая поле), без иерархии, подчинить группировке
Номенклатура
, выбрать поляПартия
,Количество
,Стоимость
;
- новую группировку (детальные записи, не выбирая поле), без иерархии, установить для неё имя
- внизу выбрать
Отчет
, перейти на вкладку Другие настройки :Выводить параметры
- выбратьНе выводить
;Макет оформления - Античный
;Расположение общих итогов по горизонтали (и по вертикали) - Нет
;Расположение полей группировок - Отдельно и только в итогах
(выведет полеНоменклатура
в отчете как отдельное);
- добавить в отчет:
- вверху на вкладке Макеты добавить заголовок (как в задании):
-
- добавить макет группировки, выбрать группировку
Заголовок
; - в табличном документе в ячейке размещаем текст заголовка из задания с параметрами ("Остатки товаров на [МоментВремени]"), форматируем шрифт как в задании, в свойствах ячейки меняем заполнение на
Шаблон
, связываем эту ячейку с макетомЗаголовок
в полеОбласть
; - связываем параметр
[МоментВремени]
шаблона с соответствующими параметрами отчета (в полеПараметрыДанных
); - форматируем вывод даты в свойствах ячейки (Формат - Дата) как в задании.
- добавить макет группировки, выбрать группировку
-
- возвращаемся на вкладку Настройки, далее - вниз, "Настройки: Отчет":
- Параметры:
МоментВремени
, указываем дату как в шапке отчета, устанавливаем флаг "Включать в пользовательские настройки"; - Выбранные поля - все выбрать ;
- устанавливаем Условное оформление, как на рисунке из задания:
- меняем шрифт заголовка (группировка Дополнительная информация) ;
- для группировки
Номенклатура
меняем цвет фона и устанавливаем полужирный шрифт в группировке; - для детальных записей устанавливаем шрифт;
- для всего отчета - цвет текста, горизонтальное и вертикальное выравнивание, шрифт и отступ (при необходимости).
- Параметры:
- При желании можно сразу изменить именование варианта (представление).