|

Стандартный подход к решению задач оперативного учета, при подготовке к экзамену «Специалист по платформе»


Содержание:

  1. Методика решения задач
  2. Первый шаг. Проектирование запроса регистра накопления
  3. Второй шаг. Процедура проведения документов
  4. Третий шаг. Построение отчетов

Методика решения задач

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

Первый шаг. Проектирование запроса регистра накопления

Начинаем с внимательного прочтения условия задачи. Отмечаем для себя важные моменты. Например,

или

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

Документы

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

Отчеты номенклатуры

Смотрим в отчет, анализируем и параллельно создаем структуру регистра.

1. Определяем, какая информация в этом отчете накапливается (Итого, нижняя строка отчета). Количество, Сумма. Вот, получаем два ресурса. Длина на ваше усмотрение, точность, согласно отчету.

2. Затем обращаем внимание на дополнительные детализирующие признаки у накапливаемой информации, которые у нас будут являться измерениями. Например:

    • Общее итоговое количество 13 – детализируется на 10 и 3, т.е. это количество поделилось по складам, Основному и Дополнительному, соответственно происходит детализация по Складам.
    • Общее количество 10 по Дополнительному складу детализировалось на 3, 3 и 4, т.е. произошла детализация по Разработчику,но данное «измерение» не совсем измерение, на это нам указывает фраза в условии задачи

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

    которая также указывает на то, что Разработчик не является измерением, иначе была вот такая фраза: «Учет товаров ведется в разрезе складов и разработчиков».

    • Общее количество 3 по Разработчику детализировалось по Номенклатуре на 2 и 1, т.е. произошла детализация по Номенклатуре.

    3. С детализацией закончили. В итоге получилось два измерения Номенклатура, Склад и два ресурса Количество, Сумма.

    4. В структуре регистров накопления также могут быть созданы и реквизиты, но, здесь надо запомнить, что при получении Остатков и Оборотов реквизиты не используются!

    5. Также обратите внимание, что у регистров накопления платформа автоматически добавляет одно измерение – это время (период)!

    6. Задаемся вопросом. Последовательность расположения измерений в структуре важна или нет? Если говорить про реальную жизнь, то конечно важна, связано это с механизмом индексирования, но с точки зрения экзамена, преподаватели советуют не заострять свое внимание на последовательность расположения измерений в структуре регистра, объясняя это тем, что время на экзамене, итак, достаточно ограничено.

    7. Добавляем в дереве конфигурации регистр накопления.

    • На вкладке «Основные» задаем Имя и определяем Вид регистра (Остатки или Обороты). Какой именно необходим вид регистра, также можно определить при анализе отчетов. Например, приведенный выше вариант отчета имеет заголовок
    • На вкладке «Данные» определяем структуру нашего регистра.
    • На вкладке «Регистраторы» определяем какие документы будут являться регистраторами по нашему регистру.
    • И наконец, не забудем установить флаг на вкладке Прочее –

    Данный флаг устанавливаем ВСЕГДА!

    Второй шаг. Процедура проведения документов

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

    Приходная накладная.

    • Добавляем в подсистему.
    • Вкладка Данные. Структура. Пробегаемся по реквизитам и ТЧ.
    • Реквизит Количество всегда флаг

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

    (избежать деления на ноль).

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

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

    что позволит нам иметь на форме гиперссылку на наш регистр.

    • Сделать настройку для автоматического заполнения реквизитов ТЧ Количество и Цена (и если решили оставить реквизит Сумма по документу, то и часть настроек для данного реквизита) [Событие – При изменении – Модуль Формы – код расчета].
    • Вкладка Движения.
    • Проведение и Оперативное проведение.

    Если в задании сказано, что нужно реализовать возможность ручного ввода записей в регистр, тогда Оперативное проведение устанавливаем в Запрещено! Нужно запомнить главное, если перепроводите какие-то документы, то необходимо перепровести все документы! Это позволит вам избежать некорректного отображения остатков по регистру.

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

    (при необходимости).

    • Записываем. Проводим. Смотрим движения по регистру(рам).

    Расходная накладная.

    • Добавляем в подсистему.
    • Данные. Структура. Пробегаемся по реквизитам и ТЧ.
    • При необходимости добавляем реквизиты, например, «Склад в шапке документа».
    • Реквизит Номенклатура в ТЧ при необходимости
    • После формирования Структуры Форма.
    • Реквизит Сумма по документу изменяем через  и не забываем про
    • Количество, Цена – Событие – При изменении – Модуль Формы – код расчета.
    • Движения.
    • Проведение и Оперативное проведение – определяемся по условию задачи.
    • Удаление движений – без изменений.
    • Конструктор движений.
    • Тип движения регистра – Расход.
    • Табличная часть выбирается только в том случае, если по данным табличной части, заполняются измерения регистра!
    • Обязательно проверяем правильность заполнения выражений!
    • Например, поле –
    • Себестоимость = Сумма списания = ЦенаСписания*Списываемое количество, где ЦенаСписания = Остаток по сумме / Остаток по количеству.
    • Определяемся с методикой проведения (Традиционная, Новая).
    • Традиционную методику выбираем когда, например, сначала мы берем ресурс Сумма и читаем по нему остатки, чтобы определить СуммуСписания, а потом, мы этот же самый ресурс и изменяем. Т.е. мы сначала читаем данные из регистра, а потом их же и изменяем тогда – Традиционная методика.
    • Программный код (вариант с Традиционной методикой).
    • Выносим код, из фигурных скобок Конструктора. Флаг записи в начало процедуры.
    • Традиционная методика.
    1. Запись пустого набора.
    2. Установка управляемых блокировок (закомментировали).

    Надо запомнить, если нам необходимо установить блокировку на несколько регистров при работе с ними, то блокировку надо устанавливать последовательно. Установили на один, отработали, перешли к другому, установили блокировку. Время блокировки должно быть минимальным. Для каждого регистра определяем конкретно по какой методике будем проводить документы.

    Правильность действия такая:

    • Если вы читаете данные из двух регистров одновременно, то сначала устанавливаем блокировку, затем один общий запрос.
    • Если читаем последовательно из каждого регистра, то блокировка, запрос для данного регистра, затем второй регистр и соответственно блокировка, запрос для второго регистра.

    3. Получение необходимых данных для формирования набора записей.

    • Если вы читаете данные одного прикладного объекта, то можно использовать как объектную модель, так и запрос. Если необходимо прочитать данные двух и более прикладных объектов сразу, тогда Запрос.
    • Конструктор запроса с обработкой результата.
    • Пользовательский режим – Запрос.
    • Таблица – ТЧ документа.
    • Поля, например
    • Группировка – обязательная обработка дублей строк.
    • Условия, например,
    • Дополнительно – Временная таблица – Данные Документа.
    • Индекс – поле, по которому будем соединяться.
    • Пакет запросов – добавляем новый пакет.
    • Таблица – например, из регистра
    • Устанавливаем параметры виртуальной таблицы.
    • Параметр Период – это точка получения остатков.

    4. Значения: Незаполнено, Дата, МоментВремени, Граница. Незаполнено – Актуальные остатки, точка в 3999 году. Дата – остатки всегда будут взяты по левой границе от времени документа. Момент времени две точки на оси времени, остатки без учета документа (без учета движений, связанных с этим документом) – левая граница (по умолчанию), остатки с учетом документа – правая граница (с учетом движений, связанных с этим документом). Граница – объект встроенного языка, доступен только программно. Имеет два параметра. Первый определяет, чью границу получаем Даты или Момента времени. Второй – какую границу получаем левую или правую. По умолчанию получает правую границу, т.е. если необходимо получить правую границу, то второй параметр можно и не указывать.

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

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

    то это означает, что мы получим ОСТАТКИ В РАЗРЕЗЕ ПАРТИЙ!

    • Выбираем Поля. Обязательным полем при работе с регистрами накопления Остатки является поле

    При необходимости обрабатываем на NULL.

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

    Как правило, при списании по партиям.

    • Итоги. Необходимы всегда для организации обхода по группировкам.
    • Сформировали запрос. Скопировали и в Программный код.
    • Устанавливаем параметры для запроса.
    • Метод СтрЗаменить(Запрос.Текст, “ОстаткиНоменклатурыОстатки.Партия.Дата”); при необходимости для запроса.

    4. Контроль полученных данных (в первую очередь – остатков по регистру).

    Получили результат, получили выборку. Внутри выборки мы должны, согласно нашей таблички, сделать контроль и сформировать набор записей.

    • Контроль остатков. Сообщение пользователю с указанием представления и количеством нехватки. Отказ в проведении. Продолжить; для установки полного списка по нехватке.

    5. Если контроль пройден успешно, то формирование записей набора регистра.

      Если НЕ Отказ Тогда.

      • Открыть результат запроса в пользовательском режиме и иметь перед глазами.
      • Внутрь второй выборки (второго цикла) помещаем ранее сформированные движения.
      • Перед второй выборкой водим переменную

      ОсталосСписать = ВыборкаНоменклатура.Количество;

      • Формируем записи по Количеству и Сумме (Себестоимости).

      Пока ВыборкаНоменклатура.Следующий() Цикл

                     // Вставить обработку выборки ВыборкаНоменклатура

                     ОсталосьСписать = ВыборкаНоменклатура.Количество;

                     ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

                     Пока ВыборкаДетальныеЗаписи.Следующий() И ОсталосьСписать > 0 Цикл

                                    // Вставить обработку выборки ВыборкаДетальныеЗаписи

                                    Движение = Движения.ТоварыНаСкладах.Добавить();

                                    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

                                    Движение.Период = Дата;

                                    Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;

                                    Движение.Склад = Склад;

                                    Движение.Количество = МИН(ОсталосьСписать,ВыборкаДетальныеЗаписи.КоличествоОстаток);

                                    Если Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда

                                                  Движение.Стоимость = ВыборкаДетальныеЗаписи.СтоимостьОстаток;

                                    Иначе

                                                  Движение.Стоимость = Движение.Количество

                                                                                                                                  /  ВыборкаДетальныеЗаписи.КоличествоОстаток

                                                                                                                                       * ВыборкаДетальныеЗаписи.СтоимостьОстаток;

                                    КонецЕсли;

                                    Движение.Партия = ВыборкаДетальныеЗаписи.Партия;

                                    ОсталосьСписать = ОсталосьСписать – Движение.Количество;

                     КонецЦикла;

      • Пользовательский режим.
      • Создаем расходную накладную №1.
      • Добавляем регистр(ы)
      • Записываем. Проводим. Смотрим движения по регистру(рам).
      • Создаем расходную накладную №2 для вывода регистра в ноль.
      • Создаем расходную накладную №3 и через Запрос в Консоли запросов проверяем остатки в регистре. Если минусов значений нет, то все ОК.
      • Возвращаемся к блокировкам.

      При установке блокировок отборы ставятся те же самые, что и при чтении.

      |          ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(

      |                             &МомВремени,

      |                             Номенклатура В

      |                                                  (ВЫБРАТЬ

      |                                                            ДанныеТЧ.Номенклатура КАК Номенклатура

      |                                                  ИЗ

      |                                                            ДанныеТЧ КАК ДанныеТЧ)

      |                                      И Склад = &Склад)   КАК   ОстаткиНоменклатурыОстатки

      Правда есть нюанс! В запросе конструкция может быть любой сложности. В Блокировках есть только два варианта:

      • отбор на равенство значению, тогда это метод  .УстановитьЗначение(“Склад”, Склад);
      • отбор на вхождение в список, тогда это метод

      .ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”); , первый параметр это поле в регистре

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

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

      ,поэтому .ИсточникДанных = СписокНоменклатуры;

      Уровень только один, никаких вложенных нельзя и если условий несколько, то они объединяются только через «И».

      6. Автоматическая запись всех модифицированных наборов после выхода из обработчика событий «Обработка проведения».

      Программный код (вариант с Новой методикой).

      • Выносим код, из фигурных скобок Конструктора.
      • Флаг записи в начало процедуры.
      • Новая методика.

      1. Получение необходимых данных для формирования набора записей.

      • Конструктор запроса с обработкой результата.
      • Пользовательский режим – Запрос.
      • Сформировали запрос. Скопировали и в Программный код.
      • Установка параметров для запроса.

      2. Формирование записей набора регистра.

      • Формируем записи набора регистра. Для этого перетаскиваем в цикл наши, ранее сформированные, движения.
      • Корректируем выборку из запроса.

      3. Запись всех модифицированных наборов.

      • Движения.Записать(); используем пакетную запись, при установке которой, флаг по записи выставленный в начале процедуры сбросится, и по окончании процедуры, повторной записи не произойдет.

      4. Автоматическая установка, при записи набора, управляемых блокировок на строки тех таблиц ИБ, к данным которых была применена внутри транзакции операция записи. (пункт выполняется последним!)

      • Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

      необходимо установить До ЗАПИСИ!  Временно ее комментируем. Когда все оттестируем в пользовательском режиме рас комментируем!

      • Если Новая методика, но без контроля остатков, то блокировать не нужно.

      5. Контроль данных, используемых при заполнении набора записей (в первую очередь – остатков по регистру).

      • Конструктор запроса с обработкой результата.
      • Пользовательский режим – Запрос простейший, только виртуальная таблица по остаткам.
      • Остатки  нужно  получить  отрицательные  с  учетом  сделанных  движений  по  данному

      документу! Параметр Период для виртуальной таблицы &Граница, точка на оси времени с учетом движений данного документа. Параметр Условие, например, ставим отбор на Номенклатуру и Склад. Отбор на Номенклатуру в списке из Табличной части (раз мы эту табличную часть указать прямо в отборе не можем, то ставим амперсант и имя табличной части) Номенклатура В (&СписокНоменклатуры) И Склад = &Склад  .

      • Поля.
      • Условие. Нас интересуют только отрицательные остатки, поэтому
      • Сформировали запрос. Посмотрели результат. Скопировали и в Программный код.
      • Установка параметров для запроса. Граница – меняем на Новый Граница, ну естественно

      от Момента времени, а вот здесь, второй параметр, ВидГраницы можно не указывать, потому что по умолчанию «Включая», а нам «включая» и нужно Запрос.УстановитьПараметр(“Граница”, Новый Граница(МоментВремени())); СписокНоменклатуры, это товары из табличной части, поэтому берем табличную часть и выгружаем колонку Номенклатура. Проверте, что выгрузить колонку в единственном числе.

      Запрос.УстановитьПараметр(“СписокНоменклатуры”, СписокНоменклатуры.ВыгрузитьКолонку(“Номенклатура”);

      • Контроль остатков. Обработка выборки. Сообщение пользователю с указанием представления и количеством нехватки. Отказ в проведении. Продолжить; для установки полного списка по нехватке.

      6. Если контроль не пройден, то отмена проведения документа.

      Третий шаг. Построение отчетов

      1. Добавляем отчет в дереве конфигурации.

        2. Задаем Имя, добавляем в подсистему и нажимаем кнопку

        3. Далее

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

        4. После формирования отчета переходим в СКД и до настраиваем отчет.

        В заключении, хочу обратить ваше внимание на два очень важных условия, которое вы всегда должны будете выполнить на экзамене:

        1. Если вы работаете с остатками, то необходимо всегда, гарантированно, в какой-то момент вывести остатки в регистре «в ноль», если другое явно не описано в задании. Чтобы остатки гарантировано вышли в ноль, необходимо чтобы в таблице движений были записи с видом движения Приход и Расход по одним и тем же измерениям. При этом и Приход, и Расход должен быть проведен на одно и тоже количество по одним и тем же измерениям, а для этого важно правильное заполнение ресурсов, которые, в первую очередь, должны быть связаны с контролем остатков.
        2. Если явно не сказано, то запомните, что всегда необходимо делать контроль остатков. Если несколько регистров остатков, то по каждому необходимо делать контроль остатков, а внутри регистра, по каждому ресурсу, например в нашем случае, необходим контроль и по сумме, и по количеству.

        Специалист компании ООО “Кодерлайн”,

        Мамаев Евгений


          Помогла ли вам статья? Оставьте свой комментарий:

          Добавить комментарий

          Ваш адрес email не будет опубликован. Обязательные поля помечены *

          Блог про 1С:Предприятие

          Copyright © 2024 TopKoder

          Мы занимаемся внедрением и обслуживанием программных продуктов 1С.