Как добавить колонки в табличную часть документа в базовой версии 1С:Бухгалтерия

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

Работа с базовыми версиями конфигураций 1С, такими как «1С:Бухгалтерия 8.3 (базовая)», накладывает на разработчика и администратора существенные ограничения. Главное из них — невозможность вносить изменения в структуру метаданных (конфигуратор закрыт для редактирования) и запрет на использование расширений конфигурации (если они не подписаны разработчиком конфигурации, то есть фирмой «1С»). Однако бизнес-задачи часто требуют добавления специфических данных, например, веса нетто, процента засоренности или особых коэффициентов в табличные части документов.

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

Ограничения базовой версии и стратегия решения

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

Рассмотрим основные способы реализации этой задачи:

  1. Использование механизма дополнительных реквизитов и сведений.
  2. Хранение сериализованных данных в стандартных строковых полях.
  3. Создание внешней обработки с собственной формой документа.

Способ 1: Сериализация данных в JSON внутри дополнительного реквизита

Это один из самых гибких и современных методов. В 1С:Бухгалтерия 3.0 практически у каждого значимого документа есть механизм «Дополнительные реквизиты». Мы можем создать один доп. реквизит с типом «Строка» (неограниченной длины) и хранить в нем данные всех строк табличной части сразу.

Рассмотрим алгоритм реализации:

  1. В режиме «1С:Предприятие» перейдем в раздел «Администрирование — Общие настройки — Дополнительные реквизиты и сведения».
  2. Добавим для нужного документа новый дополнительный реквизит, назовем его, например, ДанныеТЧ_Служебный.
  3. Создадим внешнюю обработку заполнения, которая будет подменять или дополнять форму документа.

Проанализируем структуру хранения данных. Чтобы связать данные в строке JSON со строкой табличной части документа, нам нужен уникальный ключ. В 1С строки табличной части имеют индекс, но он меняется при сортировке. Поэтому лучше использовать НомерСтроки (если он не меняется пользователем) или программно генерировать идентификаторы.

Пример структуры JSON для хранения веса и засоренности:


[
    {"N": 1, "Weight": 10.5, "Trash": 2},
    {"N": 2, "Weight": 15.0, "Trash": 0.5}
]

Для работы с этими данными во внешней обработке мы будем использовать стандартные средства платформы 1С для работы с JSON. Рассмотрим пример кода для чтения данных:


// Чтение данных из доп. реквизита документа
Функция ПрочитатьДопДанные(ДокументСсылка)
    Чтение = Новый ЧтениеJSON;
    СтрокаJSON = ""; // Здесь получаем значение нашего доп. реквизита
    
    // Логика получения значения доп. реквизита через запрос или СвойстваОбъектов
    // ...
    
    Чтение.УстановитьСтроку(СтрокаJSON);
    Данные = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    Возврат Данные; // Возвращает Массив структур
КонецФункции

Способ 2: Использование дополнительных сведений (Регистр сведений)

Если мы не хотим «засорять» сам документ строковыми данными, можно использовать Дополнительные сведения. В отличие от реквизитов, сведения хранятся в отдельном регистре ДополнительныеСведения. Это позволяет избежать прямого влияния на объект документа при записи.

Разберем, как это работает по шагам:

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

Важный момент: Так как мы работаем в базовой версии, мы не можем программно добавить колонку в ЭлементыФормы на стандартной форме документа навсегда. Нам придется каждый раз открывать форму нашей внешней обработки, которая будет «эмулировать» работу документа.

Способ 3: Использование штатных текстовых полей (Комментарий или Содержание)

Этот метод самый простой, но требует аккуратности от пользователя. В табличной части «Товары» часто есть поле Содержание (для услуг) или общее поле Комментарий документа. Мы можем договориться записывать данные туда в определенном формате.

Например, в поле Содержание строки товара можно писать: "Товар 1 [В:10.5;З:2]". Где В — вес, а З — засор.

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


Функция ИзвлечьПараметр(ИсходнаяСтрока, Префикс)
    Начало = Найти(ИсходнаяСтрока, Префикс + ":");
    Если Начало = 0 Тогда Возврат 0; КонецЕсли;
    
    Остаток = Сред(ИсходнаяСтрока, Начало + СтрДлина(Префикс) + 1);
    Конец = Найти(Остаток, ";");
    Если Конец = 0 Тогда 
        Конец = Найти(Остаток, "]");
    КонецЕсли;
    
    Значение = Лев(Остаток, Конец - 1);
    Возврат Число(Значение);
КонецФункции

Способ 4: Дополнительные реквизиты справочника «Номенклатура»

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

Проанализируем преимущества:

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

Реализация интерфейса: Внешняя обработка

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

Разберем по шагам логику работы такой обработки:

  1. Пользователь запускает обработку и выбирает документ.
  2. Обработка считывает данные документа и дополнительные данные из JSON (в доп. реквизите или сведениях).
  3. Данные объединяются и выводятся в таблицу на форме обработки.
  4. Пользователь редактирует данные (включая вес и засор).
  5. При нажатии кнопки «Записать» обработка формирует новую JSON-строку и записывает ее в доп. реквизит документа, а сам документ сохраняет.

Рассмотрим фрагмент кода для сохранения данных:


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

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

Для реализации колонок в табличной части базовой версии 1С наиболее надежным и «чистым» методом является использование Дополнительных сведений совместно с Внешней обработкой. Это позволяет:

Хотя этот путь сложнее, чем простое добавление колонки в версии ПРОФ, он является единственным легальным и технически стабильным способом расширения функционала базовых версий «1С:Бухгалтерии».

← На главную