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