Как добавить колонки цен и артикулов в справочник Номенклатура и печатные формы 1С

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При работе с программными продуктами 1С часто возникает необходимость кастомизации интерфейса под нужды конкретного бизнеса. Одной из наиболее популярных задач является вывод дополнительных колонок в форму списка справочника Номенклатура — например, цен различных типов (закупочной, розничной) или дополнительных артикулов. Также нередко требуется вывести эти же данные в печатные формы документов.

В этой статье мы подробно разберем, как решать данные задачи. Мы проанализируем архитектурные особенности старой платформы 1С:Предприятие 7.7 (поскольку именно она обсуждалась в исходной теме форума) и сопоставим их с механизмами современных версий 1С:Предприятие 8.3.

---

Почему не работает прямое добавление реквизита цены в справочник 1С 7.7?

Разберем типичную ошибку начинающих разработчиков. Автор темы попытался добавить реквизиты «Основная цена» и «Основная цена приобретения» напрямую в реквизиты справочника Номенклатура через Конфигуратор. Колонки в форме списка появились, но значения в них остались пустыми.

Выясним причину этого поведения. В типовых конфигурациях 1С 7.7 (таких как «Торговля и Склад 9.2») цены не являются статичными реквизитами самого товара. Цена — это периодическое значение, которое хранится в подчиненном справочнике Цены. У одного товара может быть множество типов цен на разные даты. Добавленные автором новые реквизиты справочника Номенклатура оказались простыми пустыми полями базы данных, никак не связанными со встроенным механизмом периодических цен.

Рассмотрим, как правильно реализовать вывод цен в список номенклатуры в 1С 7.7 и 1С 8.3.

---

Решение 1: Вывод динамических цен в форму списка в 1С 7.7

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

Разберем этот процесс по шагам:

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

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


Функция ПоказатьРозничнуюЦену()
    Перем ВремЦена, ВремЕдиница, ВремВалюта;
    
    // Проверяем, выбрана ли строка номенклатуры
    Если ТекущийЭлемент().Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;
    
    // Исключаем группы номенклатуры
    Если ТекущийЭлемент().ЭтоГруппа() = 1 Тогда
        Возврат "";
    КонецЕсли;
    
    // глПолучитьЦену — это типовая глобальная функция конфигурации ТиС 7.7
    // глТипЦеныРозничная — глобальная переменная, хранящая ссылку на тип цен "Розничная"
    Если глПолучитьЦену(ТекущийЭлемент(), глТипЦеныРозничная, РабочаяДата(), ВремЦена, ВремЕдиница, ВремВалюта) = 1 Тогда
        Возврат Формат(ВремЦена, "Ч10.2") + " " + СокрЛП(ВремВалюта);
    Иначе
        Возврат "0.00";
    КонецЕсли;
КонецФункции

Важное предупреждение по производительности в 1С 7.7:

Функции, прописанные в формулах текстовых колонок списка, вычисляются платформой при каждом обновлении экрана, интерактивной прокрутке списка или изменении положения курсора для каждой видимой строки. Если в списке отображается 20 строк, функция выполнится 20 раз. На больших базах данных при работе по сети это приведет к серьезным зависаниям интерфейса. Для оптимизации разработчики часто используют внешние компоненты (например, библиотеку 1С++ и технологию прямых SQL-запросов к СУБД) для быстрого кэширования цен в обход штатных механизмов.

---

Решение 2: Добавление дополнительного артикула в 1С 7.7 и 1С 8.3

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

Реализация в 1С 7.7:

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

Реализация в 1С 8.x (без программирования):

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

  1. Перейдите в меню НСИ и администрирование -> Общие настройки -> Дополнительные реквизиты и сведения.
  2. Выберите справочник Номенклатура и нажмите кнопку «Добавить -> Новый». Назовите его «Второй артикул».
  3. Поле автоматически появится в карточке каждого товара.
  4. Чтобы вывести этот реквизит в форму списка товаров, пользователю достаточно открыть форму списка номенклатуры, нажать кнопку Ещё -> Изменить форму, найти в дереве элементов поле Ссылка, раскрыть его структуру, установить флажок напротив нового дополнительного реквизита и нажать «Применить». ---

    Решение 3: Динамический вывод цен в 1С 8.3 с использованием произвольного запроса

    В современных конфигурациях на платформе 1С 8.3 списки строятся на основе механизма Динамических списков. Это позволяет выводить цены максимально быстро и оптимизированно без просадки производительности интерфейса.

    Проанализируем ситуацию: цены в 1С 8.3 хранятся в периодическом регистре сведений ЦеныНоменклатуры. Чтобы вывести актуальные розничные цены в динамический список справочника Номенклатура, выполним следующие действия по шагам:

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

    Посмотрим на пример SQL-подобного запроса динамического списка:

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

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

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        
        // Устанавливаем текущую дату в качестве периода для среза последних
        Список.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДата());
        
        // Находим нужный вид цены, например "Розничная"
        СсылкаНаВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Розничная");
        Список.Параметры.УстановитьЗначениеПараметра("ВыбранныйВидЦены", СсылкаНаВидЦены);
        
    КонецПроцедуры
    

    После этого перетащите добавленные поля РозничнаяЦена и ВалютаЦены из колонки реквизитов формы на элемент формы «Таблица». Платформа 1С 8.3 сама оптимизирует выполнение этого запроса на уровне СУБД, подгружая данные порциями по мере прокрутки списка пользователем.

    ---

    Решение 4: Добавление колонок в печатные формы

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

    Вывод колонки в печатную форму в 1С 7.7:

    В платформе 1С 7.7 макеты печатных форм хранятся в виде таблиц (файлы макетов встроенного отчета/документа или внешние файлы шаблонов печати .mxl в каталоге базы данных).

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

    Пример программного кода для реализации этого алгоритма в 1С 7.7:

    
    Процедура Печать()
        Таб = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("ТаблицаПечати");
        Таб.ВывестиСекцию("Шапка");
        
        ВыбратьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
            // Переменная ПечВторойАртикул должна быть прописана в ячейке макета как Выражение
            ПечВторойАртикул = Товар.АртикулПроизводителя; 
            
            // Переменная ПечЦенаЗакупа также прописана в макете
            ПечЦенаЗакупа = 0;
            глПолучитьЦену(Товар, глТипЦеныЗакупочная, РабочаяДата(), ПечЦенаЗакупа);
            
            Таб.ВывестиСекцию("Строка");
        КонецЦикла;
        
        Таб.ВывестиСекцию("Подвал");
        Таб.Показать("Печать накладной");
    КонецПроцедуры
    

    Вывод колонки в печатную форму в 1С 8.x:

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

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

    Рассмотрим пример заполнения параметров макета в коде 1С 8.3:

    
    // Создаем табличный документ и получаем макет
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("Печать");
    
    // Выводим область шапки документа
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабличныйДокумент.Вывести(ОбластьШапка);
    
    // Получаем область строки табличной части
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
        // Заполняем стандартные параметры строки
        ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
        
        // Заполняем созданный нами новый параметр
        ОбластьСтрока.Параметры.ДопАртикул = СтрокаТЧ.Номенклатура.АртикулПроизводителя;
        
        // Выводим заполненную область строки в итоговый документ
        ТабличныйДокумент.Вывести(ОбластьСтрока);
    КонецЦикла;
    
    ТабличныйДокумент.Показать("Печать документа");
    
    ---

    Подведение итогов

    Мы проанализировали и детально разобрали варианты решения распространенных задач по кастомизации списков и печатных форм 1С:

    • Выяснили, что вывод цен в 1С 7.7 требует использования функций модуля формы в формулах элементов диалога, поскольку цены являются подчиненными периодическими данными.
    • Разобрали, что добавление простых реквизитов (например, артикулов) происходит через реквизиты метаданных справочника с последующим выводом их полей в диалоговые формы.
    • Увидели, как те же самые задачи более современно и оптимизированно решаются на платформе 1С 8.3 при помощи произвольных запросов в динамических списках и механизмов дополнительных свойств.
    • Изучили логику работы и заполнения параметров/выражений при изменении макетов печатных форм в обеих версиях платформы.
← На главную