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