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

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

При активной разработке во встроенном языке 1С часто возникает желание расширить функционал базовых типов данных. Например, добавить собственный метод напрямую в объект ТаблицаЗначений или Массив, чтобы вызывать его через точку:


МояТЗ = Новый ТаблицаЗначений;
МояТЗ.МойМетод();

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

Архитектурные ограничения платформы 1С:Предприятие 8

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

  1. Методы расширения (Extension Methods): невозможно добавить новый метод или свойство к существующему платформенному типу данных.
  2. Пользовательские классы: в стандартном языке платформы 8.3 нельзя объявить собственный класс с наследованием от платформенного объекта.
  3. Динамическая модификация метаклассов (Monkey Patching): структура объектов фиксирована и не подлежит изменению во время выполнения программы.

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

Способ 1. Использование универсальных функций общего модуля

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

Рассмотрим пример создания функции для очистки строк таблицы значений по определенному отбору:


// В общем модуле (например, КоллекцииСервер или ОбщегоНазначенияКлиентСервер)
Процедура ОчиститьСтрокиСОтбором(Таблица, СтруктураОтбора) Экспорт

    НайденныеСтроки = Таблица.НайтиСтроки(СтруктураОтбора);
    Для Каждого СтрокаТЗ Из НайденныеСтроки Цикл
        Таблица.Строки.Удалить(СтрокаТЗ);
    КонецЦикла;

КонецПроцедуры

Вызов этой процедуры в прикладном коде становится простым, лаконичным и читаемым:


Отбор = Новый Структура;
Отбор.Вставить("Статус", "Неактивен");
Отбор.Вставить("Сумма", 0);

КоллекцииСервер.ОчиститьСтрокиСОтбором(МояТЗ, Отбор);

Способ 2. Правильное применение стандартных методов платформы

Часто необходимость «дописать свой метод» возникает из-за неполного использования возможностей встроенных функций платформы. Проанализируем типичные операции:

  1. Поиск по нескольким колонкам одновременно: стандартный метод НайтиСтроки() принимает объект Структура. Если передать в него несколько ключей, поиск автоматически выполнится по логическому условию «И» для всех указанных колонок.
  2. Индексация коллекций для ускорения: если таблица содержит большой объем данных и по ней часто выполняется поиск, обязательно добавляем индекс с помощью свойства Индексы. Это переводит поиск метода НайтиСтроки() с медленного полного перебора на быстрый поиск по индексу: МояТЗ.Индексы.Добавить("Номенклатура, Склад");
  3. Сложная фильтрация через запросы: для комплексной выборки с условиями «ИЛИ», группировками и вычислениями эффективнее передавать таблицу значений в объект Запрос в качестве параметра с последующей выгрузкой результата.

Способ 3. Создание объекта-обертки через обработку

Если требуется строгая инкапсуляция логики вокруг коллекции, можно спроектировать объектную обертку (Wrapper) на базе внешней или встроенной обработки конфигурации:

  1. Создаем обработку ОберткаТаблицыЗначений.
  2. В реквизитах обработки объявляем реквизит Данные с типом ТаблицаЗначений.
  3. В модуле объекта обработки описываем экспортные методы, которые работают с внутренней коллекцией:
    
    // В модуле объекта обработки
    Процедура ДобавитьСтроку(ЗначенияКолонок) Экспорт
        НоваяСтрока = Данные.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, ЗначенияКолонок);
    КонецПроцедуры
    
    Функция НайтиИУдалить(СтруктураОтбора) Экспорт
        СтрокиКУдалению = Данные.НайтиСтроки(СтруктураОтбора);
        Для Каждого Стр Из СтрокиКУдалению Цикл
            Данные.Строки.Удалить(Стр);
        КонецЦикла;
    КонецФункции
    
  4. В вызывающем коде создаем экземпляр обработки и работаем через него:
    
    Обертка = Обработки.ОберткаТаблицыЗначений.Создать();
    Обертка.ДобавитьСтроку(Новый Структура("Товар, Количество", ТоварСсылка, 10));
    Обертка.НайтиИУдалить(Новый Структура("Количество", 0));
    

Смежные технологии и новые платформы 1С

Если требования проекта предполагают полноценный объектно-ориентированный подход с классами, методами и свойствами, обратим внимание на современные решения экосистемы 1С:

  1. 1С:Предприятие Элемент: новая платформа с полноценным объектно-ориентированным языком, поддерживающим объявление собственных классов, методов и строгую типизацию.
  2. OneScript (1Script): кроссплатформенная среда выполнения сценариев, которая поддерживает конструирование пользовательских классов через ключевое слово Класс.
  3. Внешние компоненты (Native API): создание низкоуровневых объектов на языках C++, Rust или C#, подключение их через ПодключитьВнешнююКомпоненту() и создание через оператор Новый() с любым набором свойств и методов.

Для повседневной разработки в типовых и нетиповых конфигурациях 1С:Предприятие 8 оптимальным выбором остается организация библиотечных процедур в специализированных общих модулях и использование готовых функций Библиотеки стандартных подсистем (БСП).

← На главную