При работе с документами в системе 1С часто возникает необходимость автоматического заполнения табличных частей данными из регистров сведений. Это позволяет значительно ускорить ввод информации и минимизировать ошибки. В данной статье мы рассмотрим два ключевых аспекта, которые были подняты в ходе обсуждения на форуме: во-первых, как реализовать механизм заполнения табличной части документа (например, ценами поставщиков) из регистра сведений; во-вторых, как правильно использовать документ «Инвентаризация товаров», поскольку его заполнение имеет свои особенности и не всегда предполагает использование цен поставщиков.
Давайте разберем общий подход к заполнению табличной части документа данными из регистра сведений. Изначальный запрос автора касался заполнения номенклатуры и цен из регистра «ЦеныПоставщиков». Важно отметить, что у самой табличной части не может быть отдельной команды в привычном смысле; вместо этого мы создаем команду на форме документа, которая будет выполнять необходимые действия.
Прежде всего, нам понадобится создать отдельную кнопку или команду на форме документа, например, «Заполнить цены поставщиков». При нажатии на эту команду будет выполняться серверная процедура, которая и займется получением данных и их размещением в табличной части.
Рассмотрим пошаговый алгоритм, как это можно реализовать:
Товары) и собрать уникальные значения номенклатуры. Это необходимо для того, чтобы выполнить запрос к регистру сведений только для тех позиций, которые уже есть в документе. Если табличная часть пуста, возможно, нам потребуется сначала заполнить ее каким-либо другим способом, например, по остаткам, а затем уже актуализировать цены.СрезПоследних. Это критически важно, поскольку нас интересует последняя установленная цена на конкретный момент времени.Соответствие или ТаблицаЗначений. Это позволяет нам быстро найти нужную цену для каждой номенклатурной позиции, избегая повторных запросов в цикле, что крайне неэффективно. В Соответствии ключом будет Номенклатура, а значением — Цена.Цена). Не забываем также пересчитать суммовые показатели, если они зависят от цены (например, Сумма = Количество * Цена).Пример запроса для получения цен из регистра сведений:
Данный запрос позволяет получить последние установленные цены для заданного списка номенклатуры на указанную дату документа.
ВЫБРАТЬ
ЦеныСрезПоследних.Номенклатура,
ЦеныСрезПоследних.Цена
ИЗ
РегистрСведений.ЦеныПоставщиков.СрезПоследних(&ДатаДокумента, Номенклатура В (&СписокНоменклатуры)) КАК ЦеныСрезПоследних
В этом запросе:
&ДатаДокумента — это параметр, в который мы передаем дату документа.&СписокНоменклатуры — это параметр, который будет содержать массив или список уникальных значений номенклатуры, собранных из табличной части.Ключевые моменты реализации на сервере:
Вся логика по запросу данных и изменению табличной части документа должна выполняться на сервере. Это достигается использованием процедур или функций с директивой &НаСервере или &НаСервереБезКонтекста. Такой подход обеспечивает высокую производительность и корректную работу с данными, особенно при больших объемах информации.
Оптимизация:
Чтобы избежать низкой производительности, никогда не выполняйте запрос к базе данных в цикле для каждой строки табличной части. Всегда старайтесь собрать необходимые параметры (в нашем случае — список номенклатуры) и выполнить один пакетный запрос, а затем уже обрабатывать полученный результат.
Для повышения удобства пользователя часто применяется более интерактивный способ заполнения: автоматическая подстановка цены в момент выбора номенклатуры в строке табличной части. Такой подход делает работу с документом интуитивно понятной и снижает количество ручных операций.
Реализация этого подхода:
ПриИзменении. Этот обработчик будет срабатывать каждый раз, когда пользователь выбирает или изменяет номенклатуру в строке.ПриИзменении мы вызываем серверную функцию (например, с директивой &НаСервере или &НаСервереБезКонтекста), передавая ей текущую выбранную номенклатуру и дату документа. Эта функция должна быть оптимальной и возвращать только одну цену для одной позиции.Этот интерактивный подход значительно улучшает пользовательский опыт, так как цена появляется сразу после выбора номенклатуры, без необходимости нажимать дополнительные кнопки.
Вопрос автора изначально возник в контексте документа «Инвентаризация товаров». Как справедливо было замечено в ходе обсуждения, использование цен поставщиков для заполнения инвентаризации не является стандартной и правильной практикой. Давайте выясним, почему так происходит и как следует корректно работать с документом инвентаризации.
Документ «Инвентаризация товаров» предназначен для сверки фактических остатков товаров на складе с учетными данными. Его основная цель — выявление излишков или недостач. При проведении инвентаризации нас интересует учетное количество и, в случае выявления отклонений, себестоимость этих отклонений, а не актуальные закупочные цены от конкретных поставщиков.
Таким образом, логика документа «Инвентаризация товаров» не предполагает прямое использование регистра «ЦеныПоставщиков» для его заполнения.
Давайте разберем по шагам, как правильно работать с документом инвентаризации в типовых конфигурациях 1С:
Основной и наиболее часто используемый способ заполнения документа «Инвентаризация товаров» – это автоматическое заполнение по данным учетной системы. В типовых конфигурациях 1С (таких как «Управление торговлей», «Комплексная автоматизация», «ERP Управление предприятием» или «Розница») для этого предусмотрена штатная команда, которая обычно называется «Заполнить по остаткам на складе». При использовании этой команды система автоматически:
Этот механизм позволяет получить актуальную картину того, что должно быть на складе согласно данным информационной базы.
После того как документ заполнен учетными данными, начинается этап физического пересчета товаров на складе. Сотрудники склада или инвентаризационная комиссия вручную пересчитывают товары и вносят фактическое количество в соответствующую колонку табличной части документа (например, «Количество факт» или «Фактическое количество»).
В этот момент важно внимательно проверять каждую позицию. Если обнаруживаются расхождения между «Учетным количеством» и «Количеством факт», это указывает на излишки или недостачи, которые необходимо будет урегулировать.
Сам по себе документ «Инвентаризация товаров» не делает движений по регистрам учета товаров. Он является основанием для создания других документов, которые уже будут корректировать учетные данные. На основании документа инвентаризации обычно создаются:
Для автоматизации заполнения цен в документе оприходования излишков иногда реализуются дополнительные механизмы, которые могут подтягивать цены по определенному типу цен (например, «Закупочная цена») или по данным о себестоимости аналогичных товаров. Однако, это уже дополнительные доработки, а не стандартное использование регистра «ЦеныПоставщиков».
Таким образом, для инвентаризации главное — это сопоставить учетные данные с фактическими, а затем корректно оформить выявленные отклонения, при этом цены используются для оценки излишков, а себестоимость – для списания недостач.
Мы рассмотрели два различных, но связанных аспекта работы с данными в 1С. Во-первых, мы научились, как можно эффективно заполнять табличную часть документа из регистра сведений, используя пакетные запросы и серверные процедуры, а также рассмотрели интерактивный подход с обработчиком события ПриИзменении. Во-вторых, мы подробно разобрали корректный процесс проведения инвентаризации товаров, выяснили, почему цены поставщиков не являются основным источником для ее заполнения, и какие документы используются для отражения ее результатов. Понимание этих механизмов позволяет нам более грамотно и эффективно работать в системе 1С, разрабатывая оптимальные решения для бизнес-задач.