Как правильно заполнить табличную часть документа данными из регистра сведений и корректно провести инвентаризацию в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с документами в системе 1С часто возникает необходимость автоматического заполнения табличных частей данными из регистров сведений. Это позволяет значительно ускорить ввод информации и минимизировать ошибки. В данной статье мы рассмотрим два ключевых аспекта, которые были подняты в ходе обсуждения на форуме: во-первых, как реализовать механизм заполнения табличной части документа (например, ценами поставщиков) из регистра сведений; во-вторых, как правильно использовать документ «Инвентаризация товаров», поскольку его заполнение имеет свои особенности и не всегда предполагает использование цен поставщиков.

Метод 1: Заполнение табличной части документа из регистра сведений

Давайте разберем общий подход к заполнению табличной части документа данными из регистра сведений. Изначальный запрос автора касался заполнения номенклатуры и цен из регистра «ЦеныПоставщиков». Важно отметить, что у самой табличной части не может быть отдельной команды в привычном смысле; вместо этого мы создаем команду на форме документа, которая будет выполнять необходимые действия.

Реализация команды на форме

Прежде всего, нам понадобится создать отдельную кнопку или команду на форме документа, например, «Заполнить цены поставщиков». При нажатии на эту команду будет выполняться серверная процедура, которая и займется получением данных и их размещением в табличной части.

Рассмотрим пошаговый алгоритм, как это можно реализовать:

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

Пример запроса для получения цен из регистра сведений:

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


ВЫБРАТЬ
    ЦеныСрезПоследних.Номенклатура,
    ЦеныСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныПоставщиков.СрезПоследних(&ДатаДокумента, Номенклатура В (&СписокНоменклатуры)) КАК ЦеныСрезПоследних

В этом запросе:

Ключевые моменты реализации на сервере:

Вся логика по запросу данных и изменению табличной части документа должна выполняться на сервере. Это достигается использованием процедур или функций с директивой &НаСервере или &НаСервереБезКонтекста. Такой подход обеспечивает высокую производительность и корректную работу с данными, особенно при больших объемах информации.

Оптимизация:

Чтобы избежать низкой производительности, никогда не выполняйте запрос к базе данных в цикле для каждой строки табличной части. Всегда старайтесь собрать необходимые параметры (в нашем случае — список номенклатуры) и выполнить один пакетный запрос, а затем уже обрабатывать полученный результат.

Альтернативный подход: Автоматическое заполнение при изменении номенклатуры

Для повышения удобства пользователя часто применяется более интерактивный способ заполнения: автоматическая подстановка цены в момент выбора номенклатуры в строке табличной части. Такой подход делает работу с документом интуитивно понятной и снижает количество ручных операций.

Реализация этого подхода:

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

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

Метод 2: Корректное заполнение документа «Инвентаризация товаров»

Вопрос автора изначально возник в контексте документа «Инвентаризация товаров». Как справедливо было замечено в ходе обсуждения, использование цен поставщиков для заполнения инвентаризации не является стандартной и правильной практикой. Давайте выясним, почему так происходит и как следует корректно работать с документом инвентаризации.

Почему цены поставщиков не подходят для инвентаризации?

Документ «Инвентаризация товаров» предназначен для сверки фактических остатков товаров на складе с учетными данными. Его основная цель — выявление излишков или недостач. При проведении инвентаризации нас интересует учетное количество и, в случае выявления отклонений, себестоимость этих отклонений, а не актуальные закупочные цены от конкретных поставщиков.

Таким образом, логика документа «Инвентаризация товаров» не предполагает прямое использование регистра «ЦеныПоставщиков» для его заполнения.

Стандартный механизм работы с инвентаризацией в 1С

Давайте разберем по шагам, как правильно работать с документом инвентаризации в типовых конфигурациях 1С:

  1. Заполнение по остаткам на складе:

    Основной и наиболее часто используемый способ заполнения документа «Инвентаризация товаров» – это автоматическое заполнение по данным учетной системы. В типовых конфигурациях 1С (таких как «Управление торговлей», «Комплексная автоматизация», «ERP Управление предприятием» или «Розница») для этого предусмотрена штатная команда, которая обычно называется «Заполнить по остаткам на складе». При использовании этой команды система автоматически:

    • Анализирует указанный склад (или склады).
    • Собирает всю номенклатуру, которая числится на этом складе на дату документа.
    • Заполняет табличную часть документа этой номенклатурой.
    • Проставляет в колонку «Учетное количество» (или аналогичную) количество товаров, которое должно быть на складе по данным учета.

    Этот механизм позволяет получить актуальную картину того, что должно быть на складе согласно данным информационной базы.

  2. Проведение пересчета и фиксация фактического количества:

    После того как документ заполнен учетными данными, начинается этап физического пересчета товаров на складе. Сотрудники склада или инвентаризационная комиссия вручную пересчитывают товары и вносят фактическое количество в соответствующую колонку табличной части документа (например, «Количество факт» или «Фактическое количество»).

    В этот момент важно внимательно проверять каждую позицию. Если обнаруживаются расхождения между «Учетным количеством» и «Количеством факт», это указывает на излишки или недостачи, которые необходимо будет урегулировать.

  3. Оформление результатов инвентаризации:

    Сам по себе документ «Инвентаризация товаров» не делает движений по регистрам учета товаров. Он является основанием для создания других документов, которые уже будут корректировать учетные данные. На основании документа инвентаризации обычно создаются:

    • «Оприходование товаров» (для излишков): Если фактическое количество оказалось больше учетного, это означает излишек. На основании инвентаризации создается документ «Оприходование товаров», который добавляет выявленные излишки на склад.
    • «Списание товаров» (для недостач): Если фактическое количество оказалось меньше учетного, это означает недостачу. На основании инвентаризации создается документ «Списание товаров», который уменьшает количество товаров на складе на сумму недостачи.
  4. Указание цен в сопроводительных документах:
    • При списании недостачи: Себестоимость списываемых товаров рассчитывается автоматически при проведении документа списания. Система берет себестоимость из регистров учета по методу оценки запасов, который установлен в учетной политике предприятия (например, ФИФО, средняя за скользящий период). Вручную указывать цены в документе списания обычно не требуется.
    • В документе оприходования излишков: Здесь ситуация иная. Обнаруженные излишки необходимо принять к учету по определенной стоимости. Эту стоимость, как правило, приходится указывать вручную или заполнять по определенным правилам. Например, это может быть:
      • Рыночная стоимость товаров на текущий момент.
      • Последняя известная закупочная цена (если она не сильно отличается от рыночной).
      • Плановая себестоимость.

      Для автоматизации заполнения цен в документе оприходования излишков иногда реализуются дополнительные механизмы, которые могут подтягивать цены по определенному типу цен (например, «Закупочная цена») или по данным о себестоимости аналогичных товаров. Однако, это уже дополнительные доработки, а не стандартное использование регистра «ЦеныПоставщиков».

Таким образом, для инвентаризации главное — это сопоставить учетные данные с фактическими, а затем корректно оформить выявленные отклонения, при этом цены используются для оценки излишков, а себестоимость – для списания недостач.

Заключение

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

← На главную