Содержание:
- Методика решения задач
- Первый шаг. Проектирование запроса регистра накопления
- Второй шаг. Процедура проведения документов
- Третий шаг. Построение отчетов
Методика решения задач
В данной статье, «Первый шаг», а именно, проектирование регистра накопления будет рассмотрен подробно. Для двух последующих шагов будет достаточно всего лишь выстроить кратенький порядок решения. Связано это с тем, что для более продвинутых коллег, ни проведение документов, ни построение отчетов, не представляет какой-либо сложности, а вот коллегам, опыт, которых незначителен, прежде чем приступать к рассмотрению второго и третьего шагов, сначала предстоит пройти материалы по освоению Языка запросов (для этого лучше всего подходит книга Е.Ю. Хрусталева Язык запросов «1С: Предприятия 8», 2-е стереотипное издание) и Системы компоновки данных (Е.Ю. Хрусталева Разработка сложных отчетов в «1С: Предприятие 8». Система компоновки данных, 4-е стереотипное переиздание). Дополнением к выше сказанному, будет являться тот факт, что, не правильное решение именно первого шага, повлечет за собой не удачу в решении всей задачи.
Первый шаг. Проектирование запроса регистра накопления
Начинаем с внимательного прочтения условия задачи. Отмечаем для себя важные моменты. Например,

или

Далее определяем список документов, используемых в решении, при этом важно запомнить! Все документы, которые используем в решении, явно описанные в задании, никакие собственные документы придумывать нельзя. К каждому документу привязываем соответствующие ему события хозяйственной деятельности. При необходимости, используем возможности визуального восприятия информации, для этого рисуем ось времени и отображаем на ней документы и события. Например.

Документы
Теперь обращаем внимание на отчеты в условии задачи. Для наглядности рассмотрим вот такой вариант отчета.

Отчеты номенклатуры
Смотрим в отчет, анализируем и параллельно создаем структуру регистра.
1. Определяем, какая информация в этом отчете накапливается (Итого, нижняя строка отчета). Количество, Сумма. Вот, получаем два ресурса. Длина на ваше усмотрение, точность, согласно отчету.
2. Затем обращаем внимание на дополнительные детализирующие признаки у накапливаемой информации, которые у нас будут являться измерениями. Например:
- Общее итоговое количество 13 – детализируется на 10 и 3, т.е. это количество поделилось по складам, Основному и Дополнительному, соответственно происходит детализация по Складам.
- Общее количество 10 по Дополнительному складу детализировалось на 3, 3 и 4, т.е. произошла детализация по Разработчику,но данное «измерение» не совсем измерение, на это нам указывает фраза в условии задачи

которая означает, что Разработчик, это дополнительная информация номенклатуры, а, как мы знаем, дополнительная информация номенклатуры, как и любого другого объекта ссылочного типа, реализуется стандартным образом, или через механизм реквизитов, или через механизм табличных частей. Обратите на это внимание! И если вы хотите к товару добавить одно дополнительное значение, то это реквизит, а если несколько дополнительных значений, то это табличная часть. Соответственно в справочник Номенклатура, необходимо добавить реквизит Разработчик, но опять же, значение Разработчик должны храниться в справочнике, а раз так, то дополнительно создаем справочник Разработчики. В довершении сказанного, в условии есть еще и подсказка

которая также указывает на то, что Разработчик не является измерением, иначе была вот такая фраза: «Учет товаров ведется в разрезе складов и разработчиков».
- Общее количество 3 по Разработчику детализировалось по Номенклатуре на 2 и 1, т.е. произошла детализация по Номенклатуре.
3. С детализацией закончили. В итоге получилось два измерения Номенклатура, Склад и два ресурса Количество, Сумма.
4. В структуре регистров накопления также могут быть созданы и реквизиты, но, здесь надо запомнить, что при получении Остатков и Оборотов реквизиты не используются!
5. Также обратите внимание, что у регистров накопления платформа автоматически добавляет одно измерение – это время (период)!
6. Задаемся вопросом. Последовательность расположения измерений в структуре важна или нет? Если говорить про реальную жизнь, то конечно важна, связано это с механизмом индексирования, но с точки зрения экзамена, преподаватели советуют не заострять свое внимание на последовательность расположения измерений в структуре регистра, объясняя это тем, что время на экзамене, итак, достаточно ограничено.
7. Добавляем в дереве конфигурации регистр накопления.
- На вкладке «Основные» задаем Имя и определяем Вид регистра (Остатки или Обороты). Какой именно необходим вид регистра, также можно определить при анализе отчетов. Например, приведенный выше вариант отчета имеет заголовок

- На вкладке «Данные» определяем структуру нашего регистра.
- На вкладке «Регистраторы» определяем какие документы будут являться регистраторами по нашему регистру.
- И наконец, не забудем установить флаг на вкладке Прочее –

Данный флаг устанавливаем ВСЕГДА!
Второй шаг. Процедура проведения документов
На экзамене в каркасной конфигурации уже есть документы Приходная накладная и Расходная накладная, поэтому дорабатываем, а при необходимости, проектируем новые Документы.
Приходная накладная.
- Добавляем в подсистему.
- Вкладка Данные. Структура. Пробегаемся по реквизитам и ТЧ.
- Реквизит Количество всегда флаг

(Проблема Копеек) и

(избежать деления на ноль).
- При необходимости добавляем реквизиты, например, в условии задачи есть фраза «Склад в шапке документа».
- Реквизит «Сумма по документу» можем удалить из структуры, можем оставить, но если оставляем, то его заполнение при проведении документа обязательно.
- В том случае, если в условии задачи сказано, что в документе могут быть как товары, так и услуги, то в справочнике Номенклатура создается реквизит ВидНоменклатуры, тип ПеречисленияСссылка.ВидыНоменклатуры, а для самого реквизита ТЧ Номенклатура устанавливаем параметры выбора

- После формирования Структуры документа переходим на вкладку Форма, где добавляем основную форму документа, которая понадобится нам для того, чтобы:
- Через вкладку

– установить флаг

что позволит нам иметь на форме гиперссылку на наш регистр.
- Сделать настройку для автоматического заполнения реквизитов ТЧ Количество и Цена (и если решили оставить реквизит Сумма по документу, то и часть настроек для данного реквизита) [Событие – При изменении – Модуль Формы – код расчета].
- Вкладка Движения.
- Проведение и Оперативное проведение.
Если в задании сказано, что нужно реализовать возможность ручного ввода записей в регистр, тогда Оперативное проведение устанавливаем в Запрещено! Нужно запомнить главное, если перепроводите какие-то документы, то необходимо перепровести все документы! Это позволит вам избежать некорректного отображения остатков по регистру.
- Удаление движений оставляем без изменений.
- Конструктор движений

- Тип движения регистра – Приход.
- Табличная часть выбирается только в том случае, если по данным табличной части, заполняются измерения регистра!
- Нажимаем кнопку Заполнить выражения и обязательно проверяем правильность заполнения выражений!
- Определяемся с методикой проведения (Традиционная, Новая).
- Программный код.
- Выносим код, из фигурных скобок Конструктора.
- Избавляемся от дублей строк (запрос).
- Формируем движения.
- Пользовательский режим.
- Создаем приходные накладные.
- Добавляем на форму регистр(ы)

(при необходимости).
- Записываем. Проводим. Смотрим движения по регистру(рам).
Расходная накладная.
- Добавляем в подсистему.
- Данные. Структура. Пробегаемся по реквизитам и ТЧ.
- При необходимости добавляем реквизиты, например, «Склад в шапке документа».
- Реквизит Номенклатура в ТЧ при необходимости

- После формирования Структуры Форма.

- Реквизит Сумма по документу изменяем через и не забываем про

- Количество, Цена – Событие – При изменении – Модуль Формы – код расчета.
- Движения.
- Проведение и Оперативное проведение – определяемся по условию задачи.
- Удаление движений – без изменений.
- Конструктор движений.
- Тип движения регистра – Расход.
- Табличная часть выбирается только в том случае, если по данным табличной части, заполняются измерения регистра!
- Обязательно проверяем правильность заполнения выражений!
- Например, поле –

- Себестоимость = Сумма списания = ЦенаСписания*Списываемое количество, где ЦенаСписания = Остаток по сумме / Остаток по количеству.
- Определяемся с методикой проведения (Традиционная, Новая).
- Традиционную методику выбираем когда, например, сначала мы берем ресурс Сумма и читаем по нему остатки, чтобы определить СуммуСписания, а потом, мы этот же самый ресурс и изменяем. Т.е. мы сначала читаем данные из регистра, а потом их же и изменяем тогда – Традиционная методика.
- Программный код (вариант с Традиционной методикой).
- Выносим код, из фигурных скобок Конструктора. Флаг записи в начало процедуры.
- Традиционная методика.
- Запись пустого набора.
- Установка управляемых блокировок (закомментировали).
Надо запомнить, если нам необходимо установить блокировку на несколько регистров при работе с ними, то блокировку надо устанавливать последовательно. Установили на один, отработали, перешли к другому, установили блокировку. Время блокировки должно быть минимальным. Для каждого регистра определяем конкретно по какой методике будем проводить документы.
Правильность действия такая:
- Если вы читаете данные из двух регистров одновременно, то сначала устанавливаем блокировку, затем один общий запрос.
- Если читаем последовательно из каждого регистра, то блокировка, запрос для данного регистра, затем второй регистр и соответственно блокировка, запрос для второго регистра.
3. Получение необходимых данных для формирования набора записей.
- Если вы читаете данные одного прикладного объекта, то можно использовать как объектную модель, так и запрос. Если необходимо прочитать данные двух и более прикладных объектов сразу, тогда Запрос.
- Конструктор запроса с обработкой результата.
- Пользовательский режим – Запрос.
- Таблица – ТЧ документа.
- Поля, например

- Группировка – обязательная обработка дублей строк.
- Условия, например,

- Дополнительно – Временная таблица – Данные Документа.
- Индекс – поле, по которому будем соединяться.
- Пакет запросов – добавляем новый пакет.
- Таблица – например, из регистра

- Устанавливаем параметры виртуальной таблицы.
- Параметр Период – это точка получения остатков.
4. Значения: Незаполнено, Дата, МоментВремени, Граница. Незаполнено – Актуальные остатки, точка в 3999 году. Дата – остатки всегда будут взяты по левой границе от времени документа. Момент времени две точки на оси времени, остатки без учета документа (без учета движений, связанных с этим документом) – левая граница (по умолчанию), остатки с учетом документа – правая граница (с учетом движений, связанных с этим документом). Граница – объект встроенного языка, доступен только программно. Имеет два параметра. Первый определяет, чью границу получаем Даты или Момента времени. Второй – какую границу получаем левую или правую. По умолчанию получает правую границу, т.е. если необходимо получить правую границу, то второй параметр можно и не указывать.
- Параметр Условие – отборы. Задаемся вопросом надо ли поставить отбор? НАДО, ЕСЛИ ЗНАЧЕНИЕ ОГРАНИЧЕНО! Как правило, Номенклатура ограничена списком товаров из табличной части, и, например, необходим отбор по Складу. Устанавливаем отбор на Номенклатуру, поскольку у нас список товаров в табличной части, то отбор В (), и в скобочках запрос к временной таблице. Устанавливаем отбор на Склад. Склад это у нас реквизит, т.е. конкретное значение, он известен, поэтому «И» .

- Связи. Устанавливаем связи таблиц и определяем вид соединения.
- Выбираем Поля.
Если при выполнении запроса, в окно полей, мы, из виртуальной таблицы Остатков, перетаскиваем сначала измерение Партия, а затем ресурс Количество.Остаток

то это означает, что мы получим ОСТАТКИ В РАЗРЕЗЕ ПАРТИЙ!
- Выбираем Поля. Обязательным полем при работе с регистрами накопления Остатки является поле

При необходимости обрабатываем на NULL.
- Объединения/Псевдонимы. Переименовываем поля – ЭТО НЕОБХОДИМО ДЛЯ ПРОВЕРЯЮЩЕГО!
- Порядок.

Как правило, при списании по партиям.
- Итоги. Необходимы всегда для организации обхода по группировкам.
- Сформировали запрос. Скопировали и в Программный код.
- Устанавливаем параметры для запроса.
- Метод СтрЗаменить(Запрос.Текст, “ОстаткиНоменклатурыОстатки.Партия.Дата”); при необходимости для запроса.
4. Контроль полученных данных (в первую очередь – остатков по регистру).
Получили результат, получили выборку. Внутри выборки мы должны, согласно нашей таблички, сделать контроль и сформировать набор записей.
- Контроль остатков. Сообщение пользователю с указанием представления и количеством нехватки. Отказ в проведении. Продолжить; для установки полного списка по нехватке.
5. Если контроль пройден успешно, то формирование записей набора регистра.
Если НЕ Отказ Тогда.
- Открыть результат запроса в пользовательском режиме и иметь перед глазами.
- Внутрь второй выборки (второго цикла) помещаем ранее сформированные движения.
- Перед второй выборкой водим переменную
ОсталосСписать = ВыборкаНоменклатура.Количество;
- Формируем записи по Количеству и Сумме (Себестоимости).
Пока ВыборкаНоменклатура.Следующий() Цикл
// Вставить обработку выборки ВыборкаНоменклатура
ОсталосьСписать = ВыборкаНоменклатура.Количество;
ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() И ОсталосьСписать > 0 Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = МИН(ОсталосьСписать,ВыборкаДетальныеЗаписи.КоличествоОстаток);
Если Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Движение.Стоимость = ВыборкаДетальныеЗаписи.СтоимостьОстаток;
Иначе
Движение.Стоимость = Движение.Количество
/ ВыборкаДетальныеЗаписи.КоличествоОстаток
* ВыборкаДетальныеЗаписи.СтоимостьОстаток;
КонецЕсли;
Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
ОсталосьСписать = ОсталосьСписать – Движение.Количество;
КонецЦикла;
- Пользовательский режим.
- Создаем расходную накладную №1.
- Добавляем регистр(ы)

- Записываем. Проводим. Смотрим движения по регистру(рам).
- Создаем расходную накладную №2 для вывода регистра в ноль.
- Создаем расходную накладную №3 и через Запрос в Консоли запросов проверяем остатки в регистре. Если минусов значений нет, то все ОК.
- Возвращаемся к блокировкам.
При установке блокировок отборы ставятся те же самые, что и при чтении.
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МомВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ДанныеТЧ.Номенклатура КАК Номенклатура
| ИЗ
| ДанныеТЧ КАК ДанныеТЧ)
| И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки
Правда есть нюанс! В запросе конструкция может быть любой сложности. В Блокировках есть только два варианта:
- отбор на равенство значению, тогда это метод .УстановитьЗначение(“Склад”, Склад);
- отбор на вхождение в список, тогда это метод
.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”); , первый параметр это поле в регистре

второй – это поле в источнике

откуда брали Номенклатуру, из табличной части

,поэтому .ИсточникДанных = СписокНоменклатуры;
Уровень только один, никаких вложенных нельзя и если условий несколько, то они объединяются только через «И».
6. Автоматическая запись всех модифицированных наборов после выхода из обработчика событий «Обработка проведения».
Программный код (вариант с Новой методикой).
- Выносим код, из фигурных скобок Конструктора.
- Флаг записи в начало процедуры.
- Новая методика.
1. Получение необходимых данных для формирования набора записей.
- Конструктор запроса с обработкой результата.
- Пользовательский режим – Запрос.
- Сформировали запрос. Скопировали и в Программный код.
- Установка параметров для запроса.
2. Формирование записей набора регистра.
- Формируем записи набора регистра. Для этого перетаскиваем в цикл наши, ранее сформированные, движения.
- Корректируем выборку из запроса.
3. Запись всех модифицированных наборов.
- Движения.Записать(); используем пакетную запись, при установке которой, флаг по записи выставленный в начале процедуры сбросится, и по окончании процедуры, повторной записи не произойдет.
4. Автоматическая установка, при записи набора, управляемых блокировок на строки тех таблиц ИБ, к данным которых была применена внутри транзакции операция записи. (пункт выполняется последним!)
- Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
необходимо установить До ЗАПИСИ! Временно ее комментируем. Когда все оттестируем в пользовательском режиме рас комментируем!
- Если Новая методика, но без контроля остатков, то блокировать не нужно.
5. Контроль данных, используемых при заполнении набора записей (в первую очередь – остатков по регистру).
- Конструктор запроса с обработкой результата.
- Пользовательский режим – Запрос простейший, только виртуальная таблица по остаткам.
- Остатки нужно получить отрицательные с учетом сделанных движений по данному
документу! Параметр Период для виртуальной таблицы &Граница, точка на оси времени с учетом движений данного документа. Параметр Условие, например, ставим отбор на Номенклатуру и Склад. Отбор на Номенклатуру в списке из Табличной части (раз мы эту табличную часть указать прямо в отборе не можем, то ставим амперсант и имя табличной части) Номенклатура В (&СписокНоменклатуры) И Склад = &Склад .
- Поля.

- Условие. Нас интересуют только отрицательные остатки, поэтому

- Сформировали запрос. Посмотрели результат. Скопировали и в Программный код.
- Установка параметров для запроса. Граница – меняем на Новый Граница, ну естественно
от Момента времени, а вот здесь, второй параметр, ВидГраницы можно не указывать, потому что по умолчанию «Включая», а нам «включая» и нужно Запрос.УстановитьПараметр(“Граница”, Новый Граница(МоментВремени())); СписокНоменклатуры, это товары из табличной части, поэтому берем табличную часть и выгружаем колонку Номенклатура. Проверте, что выгрузить колонку в единственном числе.
Запрос.УстановитьПараметр(“СписокНоменклатуры”, СписокНоменклатуры.ВыгрузитьКолонку(“Номенклатура”);
- Контроль остатков. Обработка выборки. Сообщение пользователю с указанием представления и количеством нехватки. Отказ в проведении. Продолжить; для установки полного списка по нехватке.
6. Если контроль не пройден, то отмена проведения документа.
Третий шаг. Построение отчетов
1. Добавляем отчет в дереве конфигурации.
2. Задаем Имя, добавляем в подсистему и нажимаем кнопку

3. Далее

и создаем запрос для формирования отчета

4. После формирования отчета переходим в СКД и до настраиваем отчет.
В заключении, хочу обратить ваше внимание на два очень важных условия, которое вы всегда должны будете выполнить на экзамене:
- Если вы работаете с остатками, то необходимо всегда, гарантированно, в какой-то момент вывести остатки в регистре «в ноль», если другое явно не описано в задании. Чтобы остатки гарантировано вышли в ноль, необходимо чтобы в таблице движений были записи с видом движения Приход и Расход по одним и тем же измерениям. При этом и Приход, и Расход должен быть проведен на одно и тоже количество по одним и тем же измерениям, а для этого важно правильное заполнение ресурсов, которые, в первую очередь, должны быть связаны с контролем остатков.
- Если явно не сказано, то запомните, что всегда необходимо делать контроль остатков. Если несколько регистров остатков, то по каждому необходимо делать контроль остатков, а внутри регистра, по каждому ресурсу, например в нашем случае, необходим контроль и по сумме, и по количеству.
Специалист компании ООО “Кодерлайн”,
Мамаев Евгений
Добавить комментарий