Решение задачи 1.12
Подготовка объектов метаданных
- В свойствах конфигурации устанавливаем режим управления блокировкой данных "Управляемый"
- Создаём новый справочник "Склады"
- В документы "Приходная накладная" и "Расходная накладная" добавляем реквизит шапки "Склад" (тип: "СправочникСсылка.Склады") признак "Проверка заполнения" установить в "Выдавать ошибку"
- В документ "Расходная накладная добавляем реквизит шапки "Менеджер" (тип: "СправочникСсылка.ФизическиеЛица") признак "Проверка заполнения" установить в "Выдавать ошибку"
- Для данной задачи можно удалить реквизиты "Цена" и "Сумма" из табличной части, а также реквизит шапки "СуммаПоДокументу" т.к. нет анализа сумм продаж
- Создаём новый документ "Резервирование товаров". Реквизиты шапки "Менеджер" (тип: "СправочникСсылка.ФизическиеЛица"). Реквизиты табличной части "СписокНоменклатуры": "Номенклатура" и "Количество"
- Для всех используемых документов добавляю форму, чтобы упростить отладку. В командном интерфейсе в разделе "Перейти" устанавливаем "Видимость" для движений документа по регистрам. Если в табличной части документа есть "Цена" и "Сумма", то добавляю расчет суммы при изменении количества и цены. В модуле объекта в событии "ПередЗаписью" выполняем расчет суммы документа
-
Добавляем периодический регистр сведений "Приоритеты менеджеров"
- Период: Месяц
- Измерения: Менеджер (тип: СправочникСсылка.ФизическиеЛица), Ресурсы Приоритет (тип: Число, длина: 3, точность: 0)
-
Настраиваем регистр "ОстаткиНоменклатуры"
- Измерение "Номенклатура"
- Ставим признак "Запрет незаполненных значений"
- Добавляем измерение "Склад" (тип: "СправочникСсылка.Склады")
- Ставим признак "Запрет незаполненных значений"
- Добавляем ресурс "Себестоимость" (тип: Число, длина: 12, точность: 2) // по-умолчанию сумму считаем в рублях
- Регистраторы:
- "ПриходнаяНакладная", "РасходнаяНакладная"
- Включаем режим разделения итогов (последняя вкладка)
- Требуется для Учет в разрезе складов / склад в шапке. Себестоимость рассчитывается как средняя в разрезе складов
- Измерение "Номенклатура"
- Добавляем новый регистр "Резервы"
- Измерения:
- Номенклатура (тип: СправочникСсылка.Номенклатура)
- Менеджер(тип: СправочникСсылка.ФизическиеЛица)
- Ресурсы:
- Количество (тип: Число, длина: 10, точность: 0)
- Регистраторы:
- "Резерв ированиеТоваров", "РасходнаяНакладная"
- Требуется для учета резервов, созданных менеджерами
- Измерения:
- В целом, на этом можно было бы и остановиться, но для упрощения проверок в расходной накладной решила добавить еще один регистр. Задумка заключается также в упрощении и оптимизации выполняемых блокировок к данным. Добавляем новый регистр "СвободныеОстатки"
- Измерения:
- Номенклатура (тип: СправочникСсылка.Номенклатура)
- Ресурсы:
- Количество (тип: Число, длина: 10, точность: 0)
- Регистраторы:
- "Резерв ированиеТоваров", "ПриходнаяНакладная"
- Требуется для выполнения контроля свободных остатков по номенклатуре
- Измерения:
Третий регистр является избыточным и дулирует уже имеющуюся информацию, но при этом он упрощает и минимизирует количество блокировок в системе. На мой вгляд, оно того стоит. Фиксируем приход в регистре при проведении приходной накладной, а расход при проведении резервирования товаров. При формировании движений по регистру никаких блокировок делать не нужно, т.к. никакого контроля отстатков по этому регистру мы выполнять не будем, но при выполнении проверок на свободные остатки в расходной накладной мы будем блокировать данные на момент проведения накладной по номенклатуре документа.
Подготовка отчета
Обычно, после проектирования регистров я приступаю в разработке отчетов, это позволяет потом проще отлаживать проведение документов.
Отчет "Остатки товаров"
Разберем первый отчет более подробно. Запрос отчета.
ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
ОстаткиНоменклатурыОстатки.Склад КАК Склад,
ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество,
0 КАК Приоритет
ПОМЕСТИТЬ ВТ
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РезервыОстатки.Номенклатура,
"Резерв",
РезервыОстатки.КоличествоОстаток,
1
ИЗ
РегистрНакопления.Резервы.Остатки КАК РезервыОстатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Номенклатура КАК Номенклатура,
ВТ.Склад КАК Склад,
ВТ.Количество КАК Количество,
ВТ.Приоритет КАК Приоритет
ИЗ
ВТ КАК ВТ
УПОРЯДОЧИТЬ ПО
Номенклатура,
Приоритет
Далее на закладке "Ресурсы" указываем "Количество" как Сумма(Количество).
В настройках задаем группировку для заголовка отчета и таблицу, где строки группируются по номенклатуре, а колонки по складу и приоритету.
Не забудьте установить признак "Выводить параметры" в значение "Не выводить" на закладке "Другие настройки", т.к. параметры отчета будут выведены в заголовке. Подробное оформление заголовка отчета рассказано в статье [Шпаргалка] Свой заголовок отчету на СКД с параметрами, картинками (без программирования)
Дополнительно, в отчете добавлен макет для вывода в шапке названия склада (убираем информацию о приоритете, которую мы добавили для правильной сортировки) и выставляем саму сортировку
Устанавливаем имя для группировки "Склад, Приоритет" - Шапка. Будем его использовать при создании макета шапки отчета. На закладке "Макеты":
- Добавить макет группировки,
- Выбрать имя группировки "Шапка"
- В любой доступной ячейки добавьте "Склад" со свойствами ячейки как на картинке
- "Заполнение" в свойствах установите "Параметр"
- Получаем адрес "Имя" настроенного шаблона шапки склада
- Устанавливаем адрес в качестве области, т.е. источник для добавленной группировки макета в шаге 1.
- После установки адреса параметры макета будут заполнены автоматически.
Дополнительно в условное оформление отчета всегда добавляю центрирование горизонтального положения для ресурсов отчета
Отчет "Резервирование товаров"
Подход к настройкам отчета аналогичный, приведу только запрос отчета:
ВЫБРАТЬ
РезервыОстатки.Номенклатура КАК Номенклатура,
РезервыОстатки.Менеджер КАК Менеджер,
РезервыОстатки.КоличествоОстаток КАК КоличествоОстаток,
ЕСТЬNULL(ПриоритетыМенеджеровСрезПоследних.Приоритет, 0) КАК Приоритет
ПОМЕСТИТЬ ВТ
ИЗ
РегистрНакопления.Резервы.Остатки КАК РезервыОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыМенеджеров.СрезПоследних КАК ПриоритетыМенеджеровСрезПоследних
ПО РезервыОстатки.Менеджер = ПриоритетыМенеджеровСрезПоследних.Менеджер
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура,
"Остаток",
ОстаткиНоменклатурыОстатки.КоличествоОстаток,
-1
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Номенклатура КАК Номенклатура,
ВТ.Менеджер КАК Менеджер,
ВТ.КоличествоОстаток КАК КоличествоОстаток,
ВТ.Приоритет КАК Приоритет
ИЗ
ВТ КАК ВТ
УПОРЯДОЧИТЬ ПО
КоличествоОстаток УБЫВ
На данном этапе все объекты задачи созданы и можно добавить подсистему "Оперативный учет", включив туда все объекты, участвующие в задаче.
Настройка документа "Приходная накладная"
Для ускорения процесса первичные движения создаем через конструктор движений
Движения по второму регистру проще сделать копированием кода с корректировкой в рамках одного цикла. При наличие лишнего времени перебор табличной части лучше заменить на запрос с группировкой данных по номенклатуре. Никаких блокировок при регистрации прихода не делаем.
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.СвободныеОстатки.Записывать = Истина;
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Движение.Себестоимость = ТекСтрокаСписокНоменклатуры.Сумма;
Движение = Движения.СвободныеОстатки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
КонецЦикла;
Настройка документа "Резервирование товаров"
Также используем конструктор для формирования движений
Движения.Резервы.Записывать = Истина;
Движения.СвободныеОстатки.Записывать = Истина;
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.Резервы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Менеджер = Менеджер;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Движение = Движения.СвободныеОстатки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
КонецЦикла;
Формируем приход по резервам, который будет списан расходной накладной и расход по свободным остаткам номенклатуры.
Настройка документа "Расходная накладная"
Ключевые точки алгоритма
-
Получить приоритет менеджера документа, если не установлен, то = 0
-
Поставить признак записи и очистить прошлые записи регистров "Резервы" и "ОстаткиНоменклатуры"
-
Инициализация данных, получаем предварительным запросом данные докумена, вспомогательные сведения по менеджерам, чьи приоритеты ниже или такие же как у текущего менеджера, а значит их резервы можно не учитывать
-
Блокируем критичные для нас данных, которые не должны меняться на момент проведения документа. Нас интересует данные регистра "СвободныеОстатки" с блокировкой по номенклатуре документа и резервы менеджеров, которыми мы можем принебречь. Также блокируем резервы самого менеджера для списания установленных менеджером резервов.
-
Выполняем первую проверку задачи - наличие свободных остатков
-
Для проведения по регистру "ОстаткиНоменклатуры" будем использовать старую методику, т.к. нужны данные регистра (себестоимость). Выполняем контроль остатка товара на складе.
-
Если остатка на складе хватает, то мы можем списать остатки резервов менеджера не превышая количество, указанное в документе.
Процедура ОбработкаПроведения(Отказ, Режим)
Приоритет = РегистрыСведений.ПриоритетыМенеджеров.ПолучитьПоследнее(Дата,
Новый Структура("Менеджер", Менеджер)).Приоритет;
Если НЕ ЗначениеЗаполнено(Приоритет) Тогда
Приоритет = 0;
КонецЕсли;
//Очищаем резервы
Движения.Резервы.Записывать = Истина;
Движения.Резервы.Записать();
//Очиститли остатки
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записать();
//Инициализация первичных данных: ТЧ и Менеджеры с более низким приоритетом или таким же,
//Резервы, которые мы можем игнорировать. Резервы менеджера.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Менеджер КАК Менеджер,
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад,
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление КАК НоменклатураПредставление
|ПОМЕСТИТЬ ТЧ
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Менеджер,
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад,
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Представление
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриоритетыМенеджеровСрезПоследних.Менеджер КАК Менеджер
|ПОМЕСТИТЬ ВТ_Менеджеры
|ИЗ
| РегистрСведений.ПриоритетыМенеджеров.СрезПоследних(&МоментВремени, ) КАК ПриоритетыМенеджеровСрезПоследних
|ГДЕ
| ПриоритетыМенеджеровСрезПоследних.Приоритет <= &Приоритет
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Менеджеры.Менеджер КАК Менеджер,
| ТЧ.Номенклатура КАК Номенклатура
|ИЗ
| ВТ_Менеджеры КАК ВТ_Менеджеры,
| ТЧ КАК ТЧ";
Запрос.УстановитьПараметр("Приоритет",Приоритет);
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
РезультатПакет = Запрос.ВыполнитьПакет();
//Блокировки, для получения свободных остатков
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СвободныеОстатки");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
//Блокировки исключаемых резервов, получаем список из запроса
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Резервы");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = РезультатПакет[2];
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Менеджер", "Менеджер");
Блокировка.Заблокировать();
//в запросе получаем проблемные остатки, т.е. номенклатуру для которой свободного остатка недостаточно
//Дополнительно создаем временную таблицу с резервами, будем использовать и для списания резервов, если они есть
Запрос.Текст =
"ВЫБРАТЬ
| РезервыОстатки.Номенклатура КАК Номенклатура,
| СУММА(РезервыОстатки.КоличествоОстаток) КАК КоличествоОстаток,
| РезервыОстатки.Менеджер КАК Менеджер
|ПОМЕСТИТЬ ВТ_Резервы
|ИЗ
| РегистрНакопления.Резервы.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| тч.Номенклатура
| ИЗ
| тч КАК тч)
| И Менеджер В
| (ВЫБРАТЬ
| тч.Менеджер
| ИЗ
| ВТ_Менеджеры КАК тч)) КАК РезервыОстатки
|
|СГРУППИРОВАТЬ ПО
| РезервыОстатки.Номенклатура,
| РезервыОстатки.Менеджер
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Резервы.Номенклатура КАК Номенклатура,
| СУММА(ВТ_Резервы.КоличествоОстаток) КАК КоличествоОстаток
|ПОМЕСТИТЬ ВТ_ОбщиеРезервы
|ИЗ
| ВТ_Резервы КАК ВТ_Резервы
|
|СГРУППИРОВАТЬ ПО
| ВТ_Резервы.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧ.Номенклатура КАК Номенклатура,
| ТЧ.Количество КАК Количество,
| ТЧ.НоменклатураПредставление КАК НоменклатураПредставление,
| ЕСТЬNULL(СвободныеОстаткиОстатки.КоличествоОстаток, 0) + ЕСТЬNULL(ВТ_ОбщиеРезервы.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| ТЧ КАК ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| тч.Номенклатура
| ИЗ
| тч КАК тч)) КАК СвободныеОстаткиОстатки
| ПО ТЧ.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОбщиеРезервы КАК ВТ_ОбщиеРезервы
| ПО ТЧ.Номенклатура = ВТ_ОбщиеРезервы.Номенклатура
|ГДЕ
| (ЕСТЬNULL(СвободныеОстаткиОстатки.КоличествоОстаток, 0) + ЕСТЬNULL(ВТ_ОбщиеРезервы.КоличествоОстаток, 0) <= 0
| ИЛИ ЕСТЬNULL(СвободныеОстаткиОстатки.КоличествоОстаток, 0) + ЕСТЬNULL(ВТ_ОбщиеРезервы.КоличествоОстаток, 0) - ТЧ.Количество < 0)";
Рез1 = Запрос.Выполнить();
Если НЕ Рез1.Пустой() Тогда
Отказ = истина;
Выборка = Рез1.Выбрать();
Пока Выборка.Следующий() цикл
Сообщение = новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Нехватка доступных остатков по номенклатуре %1",Выборка.НоменклатураПредставление);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
//Контроль по складам
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.УстановитьЗначение("Склад",Склад);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
Запрос.Текст=
"ВЫБРАТЬ
| ТЧ.Номенклатура КАК Номенклатура,
| ТЧ.Количество КАК Количество,
| ТЧ.НоменклатураПредставление КАК НоменклатураПредставление,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.СебестоимостьОстаток КАК СебестоимостьОстаток
|ИЗ
| ТЧ КАК ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| Склад = &Склад
| И Номенклатура В
| (ВЫБРАТЬ
| тч.Номенклатура
| ИЗ
| тч КАК тч)) КАК ОстаткиНоменклатурыОстатки
| ПО ТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура";
Запрос.УстановитьПараметр("Склад",Склад);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() цикл
Если Выборка.КоличествоОстаток=0 Тогда
Отказ = истина;
ИначеЕсли Выборка.КоличествоОстаток - Выборка.Количество < 0 Тогда
отказ = истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Если Выборка.КоличествоОстаток = Выборка.Количество Тогда
Себестоимость = Выборка.СебестоимостьОстаток;
Иначе
Себестоимость = Окр(Выборка.СебестоимостьОстаток/Выборка.КоличествоОстаток * Выборка.Количество,2);
КонецЕсли;
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = Выборка.Количество;
Движение.Себестоимость = Себестоимость;
КонецЦикла;
Если Отказ Тогда
Возврат;
КонецЕсли;
Движения.Резервы.Записывать = Истина;
Запрос.Текст =
"ВЫБРАТЬ
| ВТ_Резервы.Номенклатура КАК Номенклатура,
| ВТ_Резервы.КоличествоОстаток КАК КоличествоОстаток
|ПОМЕСТИТЬ ВТ_РезервыМенеджера
|ИЗ
| ВТ_Резервы КАК ВТ_Резервы
|ГДЕ
| ВТ_Резервы.Менеджер = &Менеджер
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧ.Номенклатура КАК Номенклатура,
| ТЧ.Количество КАК Количество,
| ТЧ.НоменклатураПредставление КАК НоменклатураПредставление,
| ВТ_РезервыМенеджера.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| ТЧ КАК ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РезервыМенеджера КАК ВТ_РезервыМенеджера
| ПО ТЧ.Номенклатура = ВТ_РезервыМенеджера.Номенклатура";
Запрос.УстановитьПараметр("Менеджер",Менеджер);
Выборка = запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() цикл
КСписанию = Мин(Выборка.Количество,Выборка.КоличествоОстаток);
Если КСписанию>0 Тогда
Движение = Движения.Резервы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Менеджер = Менеджер;
Движение.Количество = КСписанию;
КонецЕсли;
КонецЦикла;
Запрос.МенеджерВременныхТаблиц.Закрыть();
КонецПроцедуры
Тестирование реализации выполнялось на релизе платформы 1С:Предприятие 8.3 (8.3.25.1520)
Полезный материал, который мне пригодился при решении задач:
1. Структуру изложения решения подглядела в этой статье
Пример решения задачи по оперативному учету для экзамена (1С: Специалист по платформе 8.3)
2. “Новая” и “старая” методики контроля отрицательных остатков при проведении документов
Как сдать экзамен 1С:Специалист по платформе?
Методика оперативного проведения и управляемые блокировки
3. Доп.материал по последовательности для задач 6 и 7
Последовательность …и как "я" её понимаю …
4. Регламентные задания для задачи 7
Регламентные задания: коротко и ясно о детальных расписаниях
5. В каждой задаче отчет предполагает наличие заголовка, реализованного через макет
[Шпаргалка] Свой заголовок отчету на СКД с параметрами, картинками (без программирования)
В целом, этого материала вполне достаточно, чтобы решить поставленные задачи, а вот насколько решения корректны, вот это бы хотелось обсудить.
Не решенные вопросы: по решенным задачам у меня не получилось в задаче 1.6 вывести товар и срок годности в одну ячейке. Я объединила вывод группировок и в результате они в отчете выводятся через ",", а в условиях задачи ее нет. Пробовала сделать макет поля, но у меня не вышло. Если кто-то знает, как решить этот вопрос, то буду благодарна за рекомендации.