Работа с базовыми версиями конфигураций 1С, такими как «1С:Бухгалтерия 8.3 (базовая)», накладывает на разработчика и администратора существенные ограничения. Главное из них — невозможность вносить изменения в структуру метаданных (конфигуратор закрыт для редактирования) и запрет на использование расширений конфигурации (если они не подписаны разработчиком конфигурации, то есть фирмой «1С»). Однако бизнес-задачи часто требуют добавления специфических данных, например, веса нетто, процента засоренности или особых коэффициентов в табличные части документов.
В этой статье мы подробно рассмотрим, как реализовать подобный функционал, не прибегая к покупке версии ПРОФ и сохраняя возможность типового обновления программы. Разберем несколько стратегий: от простых текстовых меток до продвинутой сериализации данных в JSON.
Прежде всего, проанализируем ситуацию: нам нужно добавить колонки «Вес» и «Процент засоренности» в табличную часть «Товары». Поскольку мы не можем добавить новые реквизиты в объект ДокументОбъект, нам необходимо найти «контейнер» для хранения этих данных, который уже существует в типовом решении, и механизм визуализации этих данных для пользователя.
Рассмотрим основные способы реализации этой задачи:
Это один из самых гибких и современных методов. В 1С:Бухгалтерия 3.0 практически у каждого значимого документа есть механизм «Дополнительные реквизиты». Мы можем создать один доп. реквизит с типом «Строка» (неограниченной длины) и хранить в нем данные всех строк табличной части сразу.
Рассмотрим алгоритм реализации:
ДанныеТЧ_Служебный.Проанализируем структуру хранения данных. Чтобы связать данные в строке JSON со строкой табличной части документа, нам нужен уникальный ключ. В 1С строки табличной части имеют индекс, но он меняется при сортировке. Поэтому лучше использовать НомерСтроки (если он не меняется пользователем) или программно генерировать идентификаторы.
Пример структуры JSON для хранения веса и засоренности:
[
{"N": 1, "Weight": 10.5, "Trash": 2},
{"N": 2, "Weight": 15.0, "Trash": 0.5}
]
Для работы с этими данными во внешней обработке мы будем использовать стандартные средства платформы 1С для работы с JSON. Рассмотрим пример кода для чтения данных:
// Чтение данных из доп. реквизита документа
Функция ПрочитатьДопДанные(ДокументСсылка)
Чтение = Новый ЧтениеJSON;
СтрокаJSON = ""; // Здесь получаем значение нашего доп. реквизита
// Логика получения значения доп. реквизита через запрос или СвойстваОбъектов
// ...
Чтение.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Возврат Данные; // Возвращает Массив структур
КонецФункции
Если мы не хотим «засорять» сам документ строковыми данными, можно использовать Дополнительные сведения. В отличие от реквизитов, сведения хранятся в отдельном регистре ДополнительныеСведения. Это позволяет избежать прямого влияния на объект документа при записи.
Разберем, как это работает по шагам:
Важный момент: Так как мы работаем в базовой версии, мы не можем программно добавить колонку в ЭлементыФормы на стандартной форме документа навсегда. Нам придется каждый раз открывать форму нашей внешней обработки, которая будет «эмулировать» работу документа.
Этот метод самый простой, но требует аккуратности от пользователя. В табличной части «Товары» часто есть поле Содержание (для услуг) или общее поле Комментарий документа. Мы можем договориться записывать данные туда в определенном формате.
Например, в поле Содержание строки товара можно писать: "Товар 1 [В:10.5;З:2]". Где В — вес, а З — засор.
Выясним причину популярности этого метода: он не требует программирования для хранения данных, только для их извлечения в печатных формах. Разберем пример функции, которая парсит такие строки:
Функция ИзвлечьПараметр(ИсходнаяСтрока, Префикс)
Начало = Найти(ИсходнаяСтрока, Префикс + ":");
Если Начало = 0 Тогда Возврат 0; КонецЕсли;
Остаток = Сред(ИсходнаяСтрока, Начало + СтрДлина(Префикс) + 1);
Конец = Найти(Остаток, ";");
Если Конец = 0 Тогда
Конец = Найти(Остаток, "]");
КонецЕсли;
Значение = Лев(Остаток, Конец - 1);
Возврат Число(Значение);
КонецФункции
Если «Вес» или «Процент засоренности» являются статичными характеристиками товара (например, вес одной единицы), то их правильнее добавить как дополнительные реквизиты к справочнику Номенклатура.
Проанализируем преимущества:
Ссылка.Номенклатура.ДополнительныеРеквизиты.Объект.Товары.Номенклатура.[ИмяДопРеквизита].Ограничение: Этот способ не подходит, если вес или процент засоренности уникальны для каждой конкретной поставки (строки документа).
Так как мы не можем менять форму документа, единственным способом предоставить пользователю удобный интерфейс является создание Внешней обработки. В ней мы создаем форму, которая визуально повторяет форму документа, но с нашими новыми колонками.
Разберем по шагам логику работы такой обработки:
Рассмотрим фрагмент кода для сохранения данных:
&НаСервере
Процедура СохранитьДанныеНаСервере(СсылкаНаДокумент, ТаблицаДанных)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТаблицаДанных);
СтрокаРезультат = ЗаписьJSON.Закрыть();
// Запись строки в дополнительные сведения
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
// Логика записи в регистр ДополнительныеСведения или в реквизит
// Используем стандартную процедуру УправлениеСвойствами.ЗаписатьСвойстваУОбъекта
// ...
КонецПроцедуры
Для реализации колонок в табличной части базовой версии 1С наиболее надежным и «чистым» методом является использование Дополнительных сведений совместно с Внешней обработкой. Это позволяет:
Хотя этот путь сложнее, чем простое добавление колонки в версии ПРОФ, он является единственным легальным и технически стабильным способом расширения функционала базовых версий «1С:Бухгалтерии».