Первый шаг в 1С — абсолютно бесплатно.
1. Что такое Динамический список и зачем он нужен? Динамический список (ДС) — это специальный объект прикладного решения в 1С:Предприятие 8.3, предназначенный для считывания и отображения больших массивов данных в элементах формы (обычно в Табличном поле). Главное преимущество динамического списка — порционное (порциями) считывание данных из базы данных. В отличие от обычной таблицы значений, которая при открытии формы загружает в память сервера и передает на клиент сразу все записи, динамический список считывает из базы только те строки, которые в данный момент видны пользователю на экране (плюс небольшой буфер для плавной прокрутки). Это обеспечивает высокую скорость работы интерфейса даже с таблицами на миллионы записей.
Динамический список используется для создания: * Списков справочников, документов, бизнес-процессов; * Журналов документов; * Произвольных отчетов и реестров прямо на формах. |
2. Источники данных Динамического списка Динамический список может работать в двух основных режимах: * Основная таблица: Данные берутся напрямую из одной таблицы базы данных (например, Справочник.Номенклатура). В этом режиме платформа автоматически поддерживает стандартные команды (создание, копирование, изменение, пометка на удаление, проведение) и быстрый поиск. * Произвольный запрос: Используется язык запросов 1С. Позволяет объединять данные из разных таблиц, добавлять вычисляемые поля, производить соединения и группировки. Важно: При использовании произвольного запроса для сохранения системных команд (создать, изменить и т. д.) необходимо явно указать свойство «Основная таблица» в настройках динамического списка. |
3. Архитектура и особенности работы: Сервер и Клиент Понимание того, где исполняется код и находятся данные, критически важно для работы с динамическим списком в управляемом приложении. * На сервере: Динамический список выполняет запрос к СУБД, формирует выборку данных, применяет настройки группировок, отборов и сортировок. Объект ДинамическийСписок существует в контексте формы на сервере. * На клиенте: На клиентскую часть передается лишь малая часть данных, необходимая для отображения текущей страницы/видимой области таблицы. На клиенте элементы таблицы списка представлены типом ТаблицаФормы. Попытка обратиться к данным конкретной строки «напрямую» на клиенте приведет к тому, что вы получите доступ только к текущей выделенной строке Элементы.Список.ТекущиеДанные , но не сможете обойти все записи списка циклом. |
4. Программная работа с Динамическим списком Ниже приведены практические примеры настройки и управления динамическим списком на языке 1С 8.3. Пример 1. Установка произвольного запроса на сервере Задача: Изменить текст запроса динамического списка при открытии формы или по нажатию кнопки, добавив левое соединение с остатками. &НаСервере Процедура НастроитьЗапросСпискаНаСервере() // Обращаемся к реквизиту формы типа "ДинамическийСписок" (например, Список) ТекстЗапроса = ВЫБРАТЬ |Номенклатура.Ссылка КАК Ссылка, |Номенклатура.Код КАК Код, |Номенклатура.Наименование КАК Наименование, |ЕСТЬНУЛЛ(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток |ИЗ |Справочник.Номенклатура КАК Номенклатура |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки |ПО ТоварыНаСкладахОстатки.Номенклатура = Номенклатура.Ссылка"; // Присваиваем новый текст запроса Список.ТекстЗапроса = ТекстЗапроса; // Устанавливаем значение параметра запроса Список.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДата()); КонецПроцедуры Пример 2. Программный отбор на сервере Задача: Установить отбор в динамическом списке по конкретному контрагенту и отключить его при необходимости. &НаСервере Процедура УстановитьОтборПоКонтрагентуНаСервере(СсылкаКонтрагент) // Поиск существующего элемента отбора по левому значению ПолеОтбора = Новый КомпоновкаДанныхПоле("Контрагент"); ЭлементОтбора = Неопределено; Для Каждого Элемент Из Список.КомпоновкаДанных.Настройки.Отбор.Элементы Цикл Если Элемент.ЛевоеЗначение = ПолеОтбора Тогда ЭлементОтбора = Элемент; Прервать; КонецЕсли; КонецЦикла; // Если элемент не найден — создаем новый Если ЭлементОтбора = Неопределено Тогда ЭлементОтбора = Список.КомпоновкаДанных.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = ПолеОтбора; КонецЕсли; // Настройка параметров отбора Если ЗначениеЗаполнено(СсылкаКонтрагент) Тогда ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = СсылкаКонтрагент; ЭлементОтбора.Использование = Истина; Иначе ЭлементОтбора.Использование = Ложь; // Отключаем отбор КонецЕсли; КонецПроцедуры Пример 3. Работа с выделенной строкой на клиенте Задача: Получить данные выделенной пользователем строки на клиенте и передать ссылку на документ во внешнюю обработку или процедуру. &НаКлиенте Процедура ОбработатьВыбраннуюСтроку(Команда) // Получаем элемент формы, отображающий динамический список ЭлементТаблица = Элементы.Список; // Читаем текущие данные выделенной строки ТекущиеДанные = ЭлементТаблица.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Предупреждение("Пожалуйста, выберите строку в списке!"); Возврат; КонецЕсли; // Доступ к полям строки осуществляется по именам колонок СсылкаНаДокумент = ТекущиеДанные.Ссылка; Сообщить("Выбран документ: " + Строка(СсылкаНаДокумент)); КонецПроцедуры
Пример 4. Обновление списка на клиенте Задача: Принудительно обновить данные динамического списка на форме после выполнения фоновых действий или изменений в базе. &НаКлиенте Процедура ОбновитьСписокНаКлиенте() // Вызов обновления динамического списка через элемент формы Элементы.Список.Обновить(); КонецПроцедуры
5. Оформление списка на форме (Условное оформление) Описание Условное оформление позволяет подсвечивать строки или отдельные ячейки динамического списка (изменять цвет фона, шрифт, текст, видимость) в зависимости от значений полей. Для правильной и быстрой работы условное оформление динамического списка рекомендуется настраивать через компоновку данных (Схема компоновки / Настройки) динамического списка на сервере. &НаСервере Процедура НастроитьУсловноеОформлениеНаСервере() // Очищаем текущие настройки оформления Список.УсловноеОформление.Элементы.Очистить(); // Создаем новый элемент условного оформления ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить(); // 1. Устанавливаем оформление (красный цвет текста) ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный); // 2. Устанавливаем условие (Проведен = Ложь) ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементУсловия.ЛевоеЗначение = Новый КомпоновкаДанныхПоле("Проведен"); ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементУсловия.ПравоеЗначение = Ложь; ЭлементУсловия.Использование = Истина; КонецПроцедуры
6. Частые ошибки и рекомендации по оптимизации * Обход динамического списка циклом: Ошибка: Попытка прочитать все строки динамического списка в цикле. Решение: Динамический список — это инструмент интерфейса, а не обработки данных. Если вам нужно обойти записи, выполняйте самостоятельный запрос (Запрос = Новый Запрос) к базе данных на сервере. * Использование тяжелых запросов в источниках: Избегайте сложных подзапросов, неограниченных соединений с виртуальными таблицами без параметров и использования функции ВЫРАЗИТЬ без необходимости. Слишком сложный запрос приведет к задержкам при прокрутке списка пользователем. * Отсутствие индексов: Поля, по которым часто выполняются отборы или сортировки в динамическом списке, должны быть проиндексированы в базе данных. |
Динамический спискок и Система компоновки данных (СКД) Динамический список «под капотом» работает именно на базе СКД. Все настройки отборов, группировок, сортировок и условного оформления, которые выполняются в коде через Список.КомпоновкаДанных.Настройки, напрямую используют механизмы СКД. |
1. Создание пользовательских команд для таблицы динамического списка Стандартные команды (создать, изменить, удалить) можно дополнять собственными кнопками. Для этого создается команда формы, связывается с обработчиком и выносится в командную панель таблицы или её контекстное меню. Это позволяет выполнять быстрые действия прямо над выделенной строкой без открытия формы объекта. Пример Задача: Добавить команду «Быстро провести», которая меняет статус выделенного документа и проводит его прямо из списка. Шаг 1. Клиентский обработчик команды &НаКлиенте Процедура БыстроПровести(Команда) // Получаем выделенную строку ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Предупреждение("Выберите документ в списке!"); Возврат; КонецЕсли; // Вызываем серверную процедуру проведение БыстроПровестиНаСервере(ТекущиеДанные.Ссылка); // Обновляем список, чтобы отобразить изменения Элементы.Список.Обновить(); КонецПроцедуры
Шаг 2. Серверная процедура выполнения действия &НаСервере Процедура БыстроПровестиНаСервере(СсылкаНаДокумент) Попытка // Получаем объект для изменения ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект(); // Выполняем проведение ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Сообщить("Документ " + Строка(СсылкаНаДокумент) + " успешно проведен."); Исключение ВызватьИсключение "Ошибка при проведении: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КонецПроцедуры
Размещение на форме: В редакторе формы перетащите созданную команду в ветку Элементы -> Список -> Командная панель или в Элементы -> Список -> Контекстное меню. 2. Параметры открытия связанных форм с предзаполнением Описание При переходе из списка в другую форму (например, при нажатии кнопки «Создать на основании» или «Открыть связанные продажи») данные из текущей строки списка передаются в новую форму через структуру Параметры. В открываемой форме передаваемые данные принимаются в событии ПриСозданииНаСервере через глобальный параметр Параметры.
Пример Задача: Из формы списка контрагентов открыть форму создания нового документа «Заказ покупателя» с автоматически подставленным контрагентом из выбранной строки. Код в форме списка (Отправитель) &НаКлиенте Процедура СоздатьЗаказДляКонтрагента(Команда) ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Предупреждение("Выберите контрагента из списка!"); Возврат; КонецЕсли; // Формируем структуру параметров ПараметрыОткрытия = Новый Структура; ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", Новый Структура("Контрагент", ТекущиеДанные.Ссылка)); // Открываем форму объекта ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыОткрытия); КонецПроцедуры
Код в форме документа «Заказ покупателя» (Получатель) &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) // Платформа автоматически обрабатывает параметр "ЗначенияЗаполнения" // для новых объектов, но при необходимости значение можно перехватить вручную: Если Параметры.Свойство("ЗначенияЗаполнения") И ЗначениеЗаполнено(Объект.Ссылка) = Ложь Тогда Значения = Параметры.ЗначенияЗаполнения; Если Значения.Свойство("Контрагент") Тогда Объект.Контрагент = Значения.Контрагент; КонецЕсли; КонецЕсли; КонецПроцедуры |
3. Множественный выбор и обработка нескольких элементов Описание Если у элемента формы «Таблица» включено свойство Режим выделения = Множественный, пользователь может выделять несколько строк с помощью клавиш Shift или Ctrl. Для получения массива выбранных строк используется свойство Элементы.Список.ВыделенныеСтроки. Оно содержит массив идентификаторов (ссылок) выбранных записей. Пример Задача: Пометить на удаление сразу несколько выбранных элементов справочника. &НаКлиенте Процедура ПометитьВыделенныеНаУдаление(Команда) // Получаем массив выделенных строк ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; Если ВыделенныеСтроки.Количество() = 0 Тогда Предупреждение("Не выделено ни одной строки!"); Возврат; КонецЕсли; // Передаем массив ссылок на сервер для обработки ОбработатьВыделенныеНаСервере(ВыделенныеСтроки); // Обновляем список Элементы.Список.Обновить(); КонецПроцедуры &НаСервере Процедура ОбработатьВыделенныеНаСервере(МассивСсылок) Для Каждого СсылкаЭлемента Из МассивСсылок Цикл Попытка Объект = СсылкаЭлемента.ПолучитьОбъект(); // Устанавливаем инверсивную пометку на удаление Объект.УстановитьПометкуУдаления(НЕ Объект.ПометкаУдаления); Исключение Сообщить("Не удалось обработать элемент: " + Строка(СсылкаЭлемента)); КонецПопытки; КонецЦикла; КонецПроцедуры |
Определение План видов характеристик — это прикладной объект метаданных, предназначенный для описания видов характеристик . Вид характеристики — это, по сути, дополнительный реквизит, который пользователь может указать для любого объекта базы данных и задать его значение. Например, «Цвет» — «Синий» или «Размер» — «Большой» . Ключевая особенность этого объекта: он хранит информацию только о том, какими видами характеристик может описываться какой-либо объект, то есть названия видов характеристик и их типы . Сами значения характеристик хранятся отдельно — в регистрах сведений или табличных частях. По своему устройству план видов характеристик очень похож на справочник: он поддерживает работу пользователей с видами характеристик («элементами») и списками, может поддерживать иерархию, может включать реквизиты и табличные части, возможно использование предопределённых видов характеристик . Однако самой важной отличительной особенностью является свойство «Тип значения». Оно позволяет определить список возможных типов данных, используемых для отдельных видов характеристик . То есть для вида характеристики «Цвет» можно определить тип значения СправочникСсылка.Цвета, для «Год выпуска» — Дата, для «Вес» — Число и так далее. Когда использовать план видов характеристик: в тех случаях, когда для объектов требуется динамически дополнять состав информации без изменения конфигурации . Основные аргументы за использование этого объекта: необходимость введения новых характеристик пользователями без изменения конфигурации, а также существенная зависимость состава характеристик от конкретных объектов . В общем случае рекомендуется прежде всего рассматривать вариант с введением нового реквизита. Использовать план видов характеристик стоит только тогда, когда для этого имеются достаточно веские причины . |
Состав и свойства плана видов характеристик Имя — идентификатор для обращения из кода. Например: СвойстваНоменклатуры, ВидыХарактеристик. Тип значения характеристик — ключевое свойство. Определяет составной тип данных, куда входят все типы, которые могут понадобиться при указании типа значения характеристики . В этот составной тип могут входить как примитивные типы (Число, Строка, Дата, Булево), так и ссылочные типы (СправочникСсылка.<имя>, ДокументСсылка.<имя>, ПланВидовХарактеристикСсылка.<имя> и так далее) . Дополнительные значения характеристик — свойство, указывающее на справочник, в котором могут храниться значения для тех видов характеристик, для которых в конфигурации нет подходящих объектов . Если пользователю станет недостаточно типов данных, существующих в системе, он сможет воспользоваться вспомогательным справочником, который разработчик создаёт заблаговременно . Этот справочник подчиняется плану видов характеристик (владелец — план видов характеристик). Это делается для того, чтобы при выборе значений характеристики из справочника информация разных видов характеристик не перемешивалась . Иерархия — план видов характеристик может быть иерархическим, как и справочник . Виды характеристик, касающиеся одной темы, можно собрать в группы. Предопределённые виды характеристик — разработчик может задать некоторые виды характеристик на этапе конфигурирования. Такие виды характеристик имеют признак Предопределенный и не могут быть удалены пользователем . |
Связь с другими объектами: хранение значений План видов характеристик сам по себе не хранит значения характеристик. Он хранит только перечень видов характеристик и их типы. Для хранения конкретных значений используется регистр сведений . Типовая логическая структура объектов для реализации механизма характеристик выглядит так : План видов характеристик — хранит виды характеристик, которыми в принципе можно описывать объекты. Например: «Цвет», «Вес», «Габариты». Справочник дополнительных значений — подчинён плану видов характеристик. Хранит конкретные значения для тех характеристик, для которых нет подходящего объекта в конфигурации. Например: «Красный», «Синий» для вида «Цвет»; «Большой», «Малый» для вида «Размер». Регистр сведений — хранит соответствие между объектом, видом характеристики и конкретным значением. Измерения регистра обычно включают сам объект (например, номенклатуру) и вид характеристики. Ресурс регистра хранит значение. В свойстве «Тип значения характеристик» плана видов характеристик указывается составной тип, включающий также ссылку на справочник дополнительных значений . В ресурсе регистра сведений используется тип Характеристика.<ИмяПланаВидовХарактеристик> — это составной тип данных, как он задан в типе значения соответствующего плана . Дополнительно настраивается Связь по типу: измерение регистра «Вид характеристики» связывается с ресурсом «Значение». Это обеспечивает соответствие типа значений, вводимых в поле, и типа характеристики, выбранной в поле «Вид характеристики» . |
Программная работа с планом видов характеристик Обращение к видам характеристик План видов характеристик по структуре таблицы очень похож на справочник. В запросах доступны поля: Ссылка, Код, Наименование, Родитель, ЭтоГруппа, Предопределенный, ТипЗначения и другие . Поле ТипЗначения имеет тип ОписаниеТипов и содержит тип значения характеристик данного вида . Пример запроса: получение списка видов характеристик с их типами: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВидыХарактеристик.Ссылка, | ВидыХарактеристик.Наименование, | ВидыХарактеристик.ТипЗначения |ИЗ | ПланВидовХарактеристик.СвойстваНоменклатуры КАК ВидыХарактеристик |ГДЕ | НЕ ВидыХарактеристик.ПометкаУдаления"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить("Характеристика: " + Выборка.Наименование); КонецЦикла; |
Программное создание вида характеристики // Создание нового вида характеристики НовыйВид = ПланыВидовХарактеристик.СвойстваНоменклатуры.СоздатьЭлемент(); НовыйВид.Наименование = "Область применения"; НовыйВид.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ОбластиПрименения"); НовыйВид.Записать(); |
Работа с характеристиками на форме Наиболее часто план видов характеристик используется в связке с механизмом характеристик на формах объектов. Например, в форме элемента справочника «Номенклатура» может быть организовано хранение и редактирование значений характеристик. Пример вывода характеристик на форму через реквизит формы: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем набор записей регистра из реквизита формы РСХарактеристики = РеквизитФормыВЗначение("Характеристики");
// Устанавливаем отбор по текущему элементу справочника РСХарактеристики.Отбор.Объект.Установить(Объект.Ссылка, Истина);
// Читаем данные РСХарактеристики.Прочитать();
// Возвращаем в реквизит формы ЗначениеВРеквизитФормы(РСХарактеристики, "Характеристики");
КонецПроцедуры Однако такой подход делает форму «тяжёлой» — при каждом открытии выполняется серверный вызов и чтение регистра. В типовых конфигурациях чаще используется вывод гиперссылки, открывающей отдельную форму с отбором по текущему объекту . Использование в отчётах через СКД: в схеме компоновки данных на закладке «Характеристики» описываются таблицы данных для получения характеристик. Указывается источник видов характеристик (план видов характеристик, поле ключа — Ссылка, поле имени — Наименование, поле типа значения — ТипЗначения) и источник значений характеристик (регистр сведений, поле объекта, поле вида, поле значения) . После этого характеристики можно выводить в отчёт, устанавливать по ним отбор и условное оформление . |
Клиент vs Сервер: особенности работы Планы видов характеристик доступны как на сервере, так и на клиенте, но создание, запись и чтение данных выполняются на сервере. На клиенте можно только вызывать серверные процедуры и функции. Создание вида характеристики на сервере: &НаСервере Процедура СоздатьВидХарактеристикиНаСервере(Наименование, ТипЗначения)
НовыйВид = ПланыВидовХарактеристик.СвойстваНоменклатуры.СоздатьЭлемент(); НовыйВид.Наименование = Наименование; НовыйВид.ТипЗначения = ТипЗначения; НовыйВид.Записать();
КонецПроцедуры Вызов с клиента: &НаКлиенте Процедура СоздатьХарактеристику()
Тип = Новый ОписаниеТипов("Число"); СоздатьВидХарактеристикиНаСервере("Вес", Тип);
КонецПроцедуры
Обращение к значениям характеристик в запросах и чтение данных из связанных регистров сведений также выполняется на сервере. Клиентский код лишь инициирует эти операции. |
Итоговая сводка План видов характеристик — объект метаданных для описания видов характеристик, которыми могут описываться объекты базы данных. Хранит названия видов характеристик и их типы. Ключевое свойство: «Тип значения характеристик» — составной тип данных, определяющий, значения какого типа могут принимать отдельные виды характеристик. Дополнительные значения характеристик — справочник, подчинённый плану видов характеристик, для хранения значений тех характеристик, для которых нет подходящих объектов в конфигурации. Хранение значений — сами значения хранятся в регистре сведений. Тип ресурса регистра задаётся как Характеристика.<ИмяПлана>. Настраивается «Связь по типу» между измерением «Вид характеристики» и ресурсом «Значение».
Когда использовать: когда состав характеристик объектов может меняться пользователем без изменения конфигурации, или когда состав характеристик существенно зависит от конкретных объектов. В общем случае рекомендуется сначала рассмотреть вариант с введением нового реквизита .
Основные области применения: хранение дополнительных свойств номенклатуры, контрагентов, документов; механизм субконто в бухгалтерском учёте . |