Работа с формами списков в 1С:Предприятие 8.3 — одна из самых востребованных задач среди разработчиков и администраторов системы. Часто возникает необходимость отобразить в списке документов или справочников дополнительные данные, которых изначально нет в стандартной форме. Например, вы хотите видеть сумму оплаты рядом с заказом клиента или дату последнего изменения карточки номенклатуры. Для этого требуется добавить реквизит на форму списка — процедура, которая на первый взгляд кажется простой, но таит множество нюансов.
В этой статье мы разберём процесс от А до Я: от подготовки конфигурации до тестирования изменений. Вы узнаете, как правильно модифицировать форму без потери обновлений, какие инструменты использовать для ускорения работы, и как избежать типичных ошибок, приводящих к обрушению интерфейса или потере данных при обновлении платформы. Материал актуален для всех конфигураций на базе 1С:Предприятие 8.3, включая «Управление торговлей», «Бухгалтерию», «Зарплату и управление персоналом».
Особое внимание уделим двум ключевым подходам: редактированию формы через конфигуратор (для опытных пользователей) и использованию расширений (рекомендованный метод для сохранения возможности обновлений). Также рассмотрим, как добавить реквизит, которого физически нет в объекте метаданных — для этого потребуется написать небольшой код на встроенном языке.
Подготовка: что нужно знать перед изменением формы списка
Прежде чем приступать к модификации формы, важно понять структуру объекта, с которым вы работаете. Форма списка в 1С — это не просто таблица с данными, а сложный механизм, включающий:
- 📋 Источник данных — справочник, документ или регистр, который отображается в списке.
- 🔧 Реквизиты формы — элементы управления (поля ввода, кнопки, таблицы), которые пользователь видит на экране.
- 🔄 Модуль формы — программный код, обрабатывающий события (например, открытие строки или изменение фильтра).
- 📊 Настройки списка — пользовательские колонки, сортировки и группировки, которые могут перекрывать ваши изменения.
Если вы добавляете реквизит, который уже существует в объекте метаданных (например, поле «Артикул» в справочнике «Номенклатура»), задача упрощается. Но если реквизита нет — потребуется либо создать его в конфигурации, либо вычислять динамически через запрос или функцию. Последний вариант чаще всего используется для отображения агрегированных данных, например, «Сумма продаж за месяц» или «Количество дней на складе».
⚠️ Внимание: Изменение стандартных форм напрямую в конфигураторе может привести к конфликтам при обновлении типовой конфигурации. Если вы не используете расширения или поддержку версий, все правки будут потеряны после обновления.
Перед началом работы:
- Создайте резервную копию информационной базы (через
Администрирование → Выгрузка/загрузка данныхили штатными средствами 1С). - Проверьте, не решается ли ваша задача стандартными средствами (например, настройкой отображения колонок через
Ещё → Настроить список). - Убедитесь, что у вас есть права на изменение конфигурации (роль «Администратор» или «Конфигуратор»).
Способ 1: Добавление реквизита через конфигуратор (для опытных)
Этот метод подходит, если вы уверены, что конфигурация не будет обновляться, или готовы поддерживать изменения вручную. Рассмотрим процесс на примере добавления колонки «Дата последнего изменения» в список справочника «Контрагенты».
Шаги:
- Откройте конфигуратор (
1Cv8.exe /Configили через меню пуска). - В дереве объектов найдите форму списка нужного справочника или документа. Например:
Справочники → Контрагенты → Формы → ФормаСписка - Откройте форму в режиме редактирования. В правой части экрана вы увидите структуру формы с вкладками
Элементы,РеквизитыиМодуль. - Перейдите на вкладку
Элементыи найдите табличное поле (обычно оно называетсяСписокилиТаблица). - В свойствах табличного поля откройте коллекцию
Колонкии добавьте новую колонку. Задайте ей имя (например,ДатаИзменения) и заголовок («Дата изменения»). - В свойстве
ПутьКДаннымукажите источник данных. Если реквизит уже есть в объекте, выберите его из списка. Если нет — потребуется написать выражение или обработчик событияПриАктивизацииСтроки.
Для динамически вычисляемых данных (например, даты последнего изменения) в модуле формы добавьте обработчик:
Процедура СписокПриАктивизацииСтроки(Элемент, Строка)
Строка.ДатаИзменения = Справочники.Контрагенты.ПолучитьСсылку(Строка.Ссылка).ДатаИзменения;
КонецПроцедуры
⚠️ Внимание: Если вы добавляете колонку с данными, которые не хранятся в базе (например, результат запроса), это может значительно замедлить загрузку списка при большом количестве строк. В таких случаях используйте отложенную загрузку или кэширование.
Добавлена новая колонка в таблицу|Указан корректный путь к данным|Обработчик события написан без ошибок|Форма сохранена и обновлена в базе|Тестирование проведено на копии данных-->
Способ 2: Использование расширений (рекомендованный метод)
Расширения конфигурации — это механизм, позволяющий модифицировать стандартные объекты без изменения их исходного кода. Преимущества:
- 🔄 Сохранение возможности обновления типовой конфигурации.
- 🛡️ Изоляция изменений — ошибки в расширении не ломают основную конфигурацию.
- 📦 Легкое переносимость изменений между базами.
Инструкция по добавлению реквизита через расширение:
- В конфигураторе откройте меню
Конфигурация → Расширения конфигурации → Добавить. - Создайте новое расширение с понятным именем (например,
ДополнительныеКолонкиВСписках). - В дереве расширения найдите форму списка, которую нужно изменить. Для этого:
Расширения → [ВашеРасширение] → Объекты → Формы → [ИмяФормы] - Нажмите
Добавить формуи выберите целевую форму из стандартной конфигурации. - В открывшейся форме повторите шаги из Способа 1: добавьте колонку, настройте путь к данным или обработчик.
- Сохраните расширение и обновите конфигурацию базы данных (
Конфигурация → Обновить конфигурацию базы данных).
Пример кода для расширения (добавление колонки с остатками номенклатуры в список):
Процедура СписокПриАктивизацииСтроки(Элемент, Строка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| , Номенклатура = &Номенклатура
| )
|ГДЕ
| Склад = &Склад";
Запрос.УстановитьПараметр("Номенклатура", Строка.Ссылка);
Запрос.УстановитьПараметр("Склад", Константы.ОсновнойСклад.Получить());
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Строка.Остаток = Результат.Остаток;
КонецЕсли;
КонецПроцедуры
Чтобы ускорить разработку, используйте шаблоны расширений из библиотеки 1С:Технологии корпоративного развития (доступны на портале ITS).
Добавление несуществующего реквизита: динамическое вычисление
Часто требуется отобразить в списке данные, которые не хранятся напрямую в объекте. Например, «Сумма задолженности клиента» или «Средний чек за последний месяц». Для этого используются:
- 📌 Запросы — для получения данных из регистров или документов.
- 🧮 Вычисляемые поля — для простых формул (например, разница между датами).
- 🔗 Внешние источники — если данные хранятся в другой системе (через HTTP-сервисы или COM-соединение).
Пример: добавим в список документов «РеализацияТоваровУслуг» колонку «Прибыль» (разница между суммой продажи и себестоимостью).
Алгоритм:
- В форме списка добавьте колонку с именем
Прибыль. - В модуле формы создайте обработчик
ПриАктивизацииСтроки:
Процедура СписокПриАктивизацииСтроки(Элемент, Строка)
Док = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Строка.Ссылка);
Себестоимость = 0;
Для Каждого Товар Из Док.Товары Цикл
Себестоимость = Себестоимость +
(Товар.Количество * ПолучитьСебестоимость(Товар.Номенклатура, Док.Дата));
КонецЦикла;
Строка.Прибыль = Док.СуммаДокумента - Себестоимость;
КонецПроцедуры
Функция ПолучитьСебестоимость(Номенклатура, Дата)
// Логика получения себестоимости (например, из регистра "СебестоимостьТоваров")
Возврат 0; // Заглушка
КонецФункции
Для оптимизации производительности:
- 🕒 Кэшируйте результаты запросов в
МенеджереВременныхТаблиц. - 🔍 Используйте индексированные поля в запросах (например,
Номенклатура.СсылкавместоНоменклатура.Наименование). - 📉 Ограничивайте период данных (например, «за последний месяц» вместо «за всё время»).
Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при модификации форм списков. Рассмотрим самые распространённые ошибки и способы их решения:
| Ошибка | Причина | Решение |
|---|---|---|
| Колонка не отображается в списке | Не указан ПутьКДанным или ошибка в имени реквизита |
Проверьте регистр символов и соответствие имён в метаданных |
| Зависание при открытии формы | Слишком тяжёлый запрос в обработчике ПриАктивизацииСтроки |
Оптимизируйте запрос или используйте отложенную загрузку |
| Данные не обновляются при изменении | Отсутствует обработчик события ПриИзменении |
Добавьте код для пересчёта значений при редактировании строки |
| Конфликт при обновлении конфигурации | Правки сделаны напрямую в стандартной форме | Перенесите изменения в расширение и восстановите стандартную форму |
| Ошибка «Поле не найдено» | Опечатка в имени реквизита или колонки | Сверьте имена в коде и в свойствах формы |
Одна из самых коварных ошибок — несоответствие типов данных. Например, если вы пытаетесь вывести в колонку тип Дата, а в коде передаёте строку, 1С не выдаст ошибку, но поле останется пустым. Всегда проверяйте типы с помощью функции ТипЗнч():
Сообщить(ТипЗнч(Строка.ДатаИзменения)); // Должно вернуть "Дата"
⚠️ Внимание: Если вы используете управляемые формы, избегайте прямого обращения к элементам черезЭлементыФормы. Вместо этого используйте методы формы, напримерЭлементы.Список.ТекстоваяКолонка1.
Тестирование и отладка изменений
После добавления реквизита обязательно протестируйте форму в разных сценариях:
- Открытие формы — проверьте, что список загружается без ошибок.
- Фильтрация и сортировка — убедитесь, что новая колонка участвует в стандартных механизмах.
- Редактирование строки — если колонка редактируемая, проверьте сохранение данных.
- Печать и выгрузка — некоторые отчёты могут использовать данные из списка.
- Мобильное приложение — если используется, проверьте отображение на всех устройствах.
Инструменты для отладки:
- 🐞 Отладчик 1С — установите точки останова в обработчиках событий.
- 📡 Журнал регистрации — включите запись событий для анализа ошибок (
Администрирование → Журнал регистрации). - 🔍 Тестирование и исправление — встроенный механизм проверки конфигурации (
Конфигурация → Тестирование и исправление).
Пример кода для логирования ошибок:
Процедура СписокПриАктивизацииСтроки(Элемент, Строка)
Попытка
// Ваш код здесь
Исключение
ЗаписатьЛог(ОписаниеОшибки(), УровеньЖурнала.Ошибка);
КонецПопытки;
КонецПроцедуры
Как включить расширенный журнал регистрации?
1. Откройте конфигуратор.
2. Перейдите в Администрирование → Журнал регистрации.
3. Нажмите Настройка и установите флаги:
- Регистрировать события информационной базы
- Регистрировать события системы
- Уровень детализации: Отладка
4. Сохраните настройки и перезапустите сеанс.
Советы по оптимизации производительности
Добавление вычисляемых колонок может значительно замедлить работу списка, особенно если в нём тысячи строк. Чтобы избежать тормозов:
- ⚡ Отложенная загрузка — грузите данные только для видимых строк:
Процедура СписокПриАктивизацииСтроки(Элемент, Строка)Если НЕ Строка.ЭтоГруппа Тогда
Если Строка.Видимая Тогда
// Загружаем данные только для видимой строки
КонецЕсли;
КонецЕсли;
- 🗃️ Кэширование — храните результаты запросов в временной таблице или в
МенеджереВременныхТаблиц. - 📈 Пагинация — ограничивайте количество загружаемых строк (например, первые 100).
- 🔄 Фоновое обновление — используйте
ЗапуститьФоновоеЗадание()для длительных операций.
Для колонок с данными из регистров накопления (например, остатки) используйте виртуальные таблицы:
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| , Номенклатура В (&СписокНоменклатуры)
| ) КАК ОстаткиНоменклатурыОстатки";
Используйте виртуальные таблицы регистров вместо прямых запросов к движениям — это ускоряет выборку в 10-100 раз.
FAQ: Частые вопросы по добавлению реквизитов в формы списков
Можно ли добавить реквизит в форму списка без правки конфигурации?
Да, для этого используйте внешние обработки или расширения конфигурации. Внешняя обработка может подключаться к форме через механизм ДополнительныеОтчетыИОбработки и модифицировать её «на лету». Однако такой подход менее надёжен, чем расширения, так как зависит от версий платформы.
Почему после добавления колонки форма перестала открываться?
Наиболее вероятные причины:
- Синтаксическая ошибка в коде модуля формы (проверьте через
Конфигурация → Тестирование и исправление). - Бесконечный цикл в обработчике события (например, рекурсивный вызов
ПриАктивизацииСтроки). - Несовместимость версий — если вы редактировали форму в новой версии платформы, а база работает на старой.
Восстановите форму из резервной копии или откатите изменения через Конфигурация → Поддержка → Настройка поддержки.
Как сделать колонку редактируемой?
Для этого:
- В свойствах колонки установите
Редактируемая = Истина. - Добавьте обработчик события
ПриИзменениидля сохранения данных:Процедура СписокДатаИзмененияПриИзменении(Элемент, Строка)Док = Документы.ЗаказКлиента.ПолучитьСсылку(Строка.Ссылка);
Док.ДатаИзменения = Строка.ДатаИзменения;
Док.Записать();
КонецПроцедуры
- Убедитесь, что у пользователя есть права на редактирование объекта.
Можно ли добавить в список данные из другой базы?
Да, для этого используйте:
- HTTP-сервисы — если другая база доступна по сети.
- COM-соединение — для локальных баз.
- Обмен через XML/JSON — для периодической синхронизации.
Пример кода для получения данных через HTTP:
Функция ПолучитьДанныеИзВнешнейБазы(ИдОбъекта)
Запрос = Новый HTTPЗапрос("https://api.example.com/data");
Запрос.Заголовки.Вставить("Authorization", "Bearer token");
Ответ = Новый HTTPСоединение.Получить(Запрос);
Возврат JSON.Прочитать(Ответ.ПолучитьТекст()).Данные;
КонецФункции
Не забывайте обрабатывать ошибки соединения и тайм-ауты!
Как перенести изменения на другую базу?
Способы переноса:
- 📦 Выгрузка/загрузка расширения — если изменения сделаны через расширение (
.cfeфайл). - 📄 Сравнение и объединение конфигураций — для прямых правок в конфигураторе (
Конфигурация → Сравнить, объединить). - 🔄 CF-файл — выгрузите всю конфигурацию и загрузите на другой базе.
Для расширений:
// Выгрузка
Расширение.Выгрузить("C:\temp\МоеРасширение.cfe");
// Загрузка
Расширения.Загрузить("C:\temp\МоеРасширение.cfe");