Как добавить поле «Поставщик» в документ «Перемещение запасов» в 1С:УНФ и настроить его работу?

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

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

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

Шаг 1. Создание реквизита в метаданных документа

Очень распространенная ошибка разработчиков, только начинающих знакомство с платформой «1С:Предприятие», — это попытка создать реквизит непосредственно на самой управляемой форме. Если добавить колонку только в интерфейсном дереве элементов формы, то данные, вводимые пользователем, не будут сохраняться в базе данных после закрытия документа.

Разберем правильный порядок действий по шагам:

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

Шаг 2. Размещение и настройка поля на управляемой форме

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

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

Шаг 3. Ограничение списка выбора (Параметры выбора)

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

В свойствах созданного элемента формы ЗапасыПоставщик найдем свойство Параметры выбора. Нажмем кнопку открытия и добавим новое условие отбора:

Отбор.Поставщик (Истина)

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

Шаг 4. Анализ и исправление ошибки компиляции

В процессе самостоятельной работы автор темы столкнулся со следующей ошибкой компиляции:

{Документ.ПеремещениеЗапасов.Форма.ФормаДокумента.Форма(2710,20)}: Процедура или функция с указанным именем не определена (ПолучитьДанныеПоставщикПриИзменении)

Проанализируем причину этой ошибки. Код в процедуре ЗапасыНоменклатураПриИзменении выполняется на клиенте (директива &НаКлиенте). Платформа 1С строго разграничивает выполнение кода между клиентским приложением и сервером базы данных. Функция ПолучитьДанныеНоменклатураПриИзменении — это специальная серверная функция, написанная разработчиками УНФ для получения свойств товара (единиц измерения, признаков использования характеристик и т.д.) без контекста формы.

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

Шаг 5. Автоматическое заполнение поставщика при выборе товара

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

Давайте модифицируем типовую процедуру ЗапасыНоменклатураПриИзменении. Мы добавим вызов серверной функции для получения основного поставщика номенклатуры.

Посмотрим на пример реализации кода:


&НаКлиенте
Процедура ЗапасыНоменклатураПриИзменении(Элемент)
    
    СтрокаТабличнойЧасти = Элементы.Запасы.ТекущиеДанные;
    Если СтрокаТабличнойЧасти = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    СтруктураДанные = Новый Структура;
    СтруктураДанные.Вставить("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
    
    // Получаем типовые данные номенклатуры через стандартную функцию формы
    СтруктураДанные = ПолучитьДанныеНоменклатураПриИзменении(СтруктураДанные);
    
    СтрокаТабличнойЧасти.ЕдиницаИзмерения = СтруктураДанные.ЕдиницаИзмерения;
    СтрокаТабличнойЧасти.СтранаПроисхождения = СтруктураДанные.СтранаПроисхождения;
    СтрокаТабличнойЧасти.НомерГТД = Неопределено;
    СтрокаТабличнойЧасти.Количество = 1;
    
    // НАЧАЛО НАШЕЙ ДОРАБОТКИ
    // Получаем основного поставщика номенклатуры с сервера
    Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
        СтрокаТабличнойЧасти.Поставщик = ПолучитьОсновногоПоставщикаНаСервере(СтрокаТабличнойЧасти.Номенклатура);
    Иначе
        СтрокаТабличнойЧасти.Поставщик = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
    КонецЕсли;
    // КОНЕЦ НАШЕЙ ДОРАБОТКИ
    
    // Далее идет стандартный код обработки серийных номеров, характеристик и партий
    Для каждого ВыделеннаяСтрока Из Элементы.Запасы.ВыделенныеСтроки Цикл
        ТекущиеДанныеСтроки = Элементы.Запасы.ДанныеСтроки(ВыделеннаяСтрока);
        РаботаССерийнымиНомерамиКлиентСервер.УдалитьСерийныеНомераПоКлючуСвязи(Объект.СерийныеНомера, ТекущиеДанныеСтроки,,ИспользоватьСерийныеНомераОстатки);
    КонецЦикла;
    
    СтрокаТабличнойЧасти.ИспользоватьХарактеристики = СтруктураДанные.ИспользоватьХарактеристики;
    СтрокаТабличнойЧасти.ПроверятьЗаполнениеХарактеристики = СтруктураДанные.ПроверятьЗаполнениеХарактеристики;
    СтрокаТабличнойЧасти.ЗаполнениеХарактеристикиПроверено = Истина;
    
    Если СтруктураДанные.ИспользоватьХарактеристики Тогда
        СтрокаТабличнойЧасти.Характеристика = СтруктураДанные.Характеристика;
    КонецЕсли;
    
    СтрокаТабличнойЧасти.ИспользоватьПартии = СтруктураДанные.ИспользоватьПартии;
    СтрокаТабличнойЧасти.ПроверятьЗаполнениеПартий = СтруктураДанные.ПроверятьЗаполнениеПартий;
    Если СтруктураДанные.ИспользоватьПартии Тогда
        СтрокаТабличнойЧасти.Партия = СтруктураДанные.Партия;
    КонецЕсли;
    
КонецПроцедуры

Для того чтобы получить значение основного поставщика из базы данных, нам необходимо написать процедуру, выполняющуюся на стороне сервера без контекста формы (для обеспечения максимального быстродействия). Разместим её в самом конце модуля формы:


&НаСервереБезКонтекста
Функция ПолучитьОсновногоПоставщикаНаСервере(Знач ВыбНоменклатура)
    
    Возврат ВыбНоменклатура.ОсновнойПоставщик;
    
КонецФункции

Шаг 6. Важное предупреждение о проведении документа и отчетах

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

В 1С:УНФ за распределение запасов по поставщикам отвечает механизм партионного учета. В системе каждая партия (справочник ПартииНоменклатуры) жестко привязана к первичному документу поступления и, соответственно, к поставщику. Если в вашей организации включен партионный учет, то информация о поставщике уже хранится в реквизите Партия табличной части Запасы.

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

← На главную