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