Загрузка списка значений в стандартных отчетах (Обычное приложение)

23.11.18

Разработка - Инструментарий разработчика

Загрузка данных из табличного документа в список значений для отбора в стандартных отчетах (в режиме Обычного приложения системы 1С: Предприятие 8). Назначение - быстрое копирование списков значений для отборов.

Скачать файлы

Наименование Файл Версия Размер
Внешняя обработка "Подбор списка значений"
.epf 32,60Kb
67
.epf 1.1 32,60Kb 67 Скачать
Конфигурация
.cf 923,38Kb
28
.cf 923,38Kb 28 Скачать
Выгрузка
.dt 968,71Kb
30
.dt 968,71Kb 30 Скачать

 

Постановка задачи

Часто возникает необходимость задавать отборы в отчетах в виде списка значений, но ввод данного списка достаточно трудоемок. По сути, предлагается выбрать каждый элемент отдельно, что безусловно неудобно. К тому же часто необходимо использовать результат одного отчета в качестве отбора для другого, а расшифровка подобного рода не предусмотрена. Например, ставится задача, зная список товаров, который был закуплен от поставщика в течение месяца, получить продажи всех товаров из списка скажем за последние полгода. Если список невелик, то проблемы нивелируются. Если же список насчитывает сотни товаров, то выбрать каждый из них вручную в список значений для отбора крайне затруднительно (помимо трудоемкости также возможны и ошибки при выборе).

Решение задачи

К счастью множество стандартных отчетов используют общие формы, что позволяет подменить для них форму подбора списка значений для отборов. А уже имеющаяся внешняя обработка с диска ИТС "ЗагрузкаДанныхИзТабличногоДокумента" позволяет без проблем заполнить список из табличного поля. Таким образом, действия пользователя сведутся к копированию списка из отчета и вставки этого списка в отбор.Внешняя обработка

Отчеты, основанные на построителе отчетов, используют в качестве шаблона отчет под названием "Универсальный отчет", а отчеты, основанные на системе компоновки данных, базируются на так называемом шаблоне типового отчета, неотъемлемой частью которого является модуль "ТиповыеОтчеты". Именно эти объекты и возможно модифицировать в конфигурации для вызова собственной обработки подбора списка значений.

Для простоты модификации и поддержки при обновлениях лучше использовать общий модуль и осуществлять вызовы процедур модификации расположенные в нём. Назовем подобный модуль, скажем "Модуль_ПодборСпискаЗначений". Содержимое модуля примерно следующее (полный текст модуля имеется в прилагаемой конфигурации): 

// *************  УниверсальныйОтчет *************

// Добавлено в обработчик "ТабличноеПолеОтборЗначениеНачалоВыбора" формы настройки, 
// а также дополнительно в модуль "БухгалтерскиеОтчеты" - обработчик "ОбработатьВыборДляСтрокиОтбораБухОтчетов",
//                       в модуль "ТиповыеОтчеты" - обработчик "ОбработкаНажатияКнопкиПодбор"
// Назначение: Вызов дополнительной обработки выбора списка значений

&НаКлиенте
Процедура ДополнительнаяОбработкаПодбораЗначения(ЗначениеЭлемента, СтандартнаяОбработка, МассивТипов = Неопределено) Экспорт
	Попытка                                                                                     
		ИмяФайла = ПолучитьИмяВременногоФайла("epf");
		ДвоичныеДанные = Справочники.ВнешниеОбработки.НайтиПоНаименованию("Подбор списка значений", истина).ХранилищеВнешнейОбработки.Получить();
		ДвоичныеДанные.Записать(ИмяФайла);
		ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайла);
		ВнешняяОбработка.ПодборСпискаЗначений(ЗначениеЭлемента, МассивТипов);
		ВнешняяОбработка = Неопределено;
		УдалитьФайлы(ИмяФайла);
		СтандартнаяОбработка = Ложь;
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Цель данного кода одна - запустить внешнюю обработку (которая также прилагается), передав ей список значений с которым и будут производиться действия. Дополнительно указывается массив возможных типов.

Модификация поведения отчетов на основе построителя отчетов 

Осталось лишь разместить вызов данной процедуры. Например вот так:

Процедура ТабличноеПолеОтборЗначениеНачалоВыбора(Элемент, СтандартнаяОбработка)

	// Отборы по свойствам и категориям должны быть обработаны специальным образом
	// Они определяются по представлению 
	Если Найти(НРег(ЭлементыФормы["ТабличноеПолеОтбор" + СтрЗаменить(Панель.ТекущаяСтраница.Имя, "СтраницаНастройка", "")].ТекущаяСтрока.Представление), "св-во") Тогда

		Свойство = мСоответствиеНазначений.Получить(ЭлементыФормы["ТабличноеПолеОтбор" + СтрЗаменить(Панель.ТекущаяСтраница.Имя, "СтраницаНастройка", "")].ТекущаяСтрока.Представление);
		УправлениеОтчетами.ОсуществитьВыборСвойства(Элемент, Свойство, ЭтаФорма, СтандартнаяОбработка);
		
	ИначеЕсли Найти(НРег(ЭлементыФормы["ТабличноеПолеОтбор" + СтрЗаменить(Панель.ТекущаяСтраница.Имя, "СтраницаНастройка", "")].ТекущаяСтрока.Представление), "(категории)") Тогда
		
		Назначение = мСоответствиеНазначений.Получить(ЭлементыФормы["ТабличноеПолеОтбор" + СтрЗаменить(Панель.ТекущаяСтраница.Имя, "СтраницаНастройка", "")].ТекущаяСтрока.Представление);
		УправлениеОтчетами.ОсуществитьВыборКатегории(Элемент, Назначение, ЭтаФорма, СтандартнаяОбработка);
		
	//*************************************** Модуль_ПодборСпискаЗначений *****************************************//		
	ИначеЕсли ТипЗнч(Элемент.Значение)=Тип("СписокЗначений") Тогда	

		Модуль_ПодборСпискаЗначений.ДополнительнаяОбработкаПодбораЗначения(Элемент.Значение, СтандартнаяОбработка);
		
	//****************************************************************************************//		
	КонецЕсли;
		
КонецПроцедуры // ТабличноеПолеОтборЗначениеНачалоВыбора()

Вот и всё - теперь все отчеты построенные на основе отчета "УниверсальныйОтчет" (например "Продажи", "Закупки" и пр.) будут вызывать нашу обработку при попытке выбрать список значений в отборах. Правда отчет при этом должен пользоваться стандартной формой настройки отчета.

 Настройка Универсального отчета

Бухгалтерские отчеты имеют другие формы настройки, но используют процедуры общего модуля "Бухгалтерские отчеты". Что позволяет также произвести следующую модификацию:

Процедура ОбработатьВыборДляСтрокиОтбораБухОтчетов(СтрокаОтбора, Элемент, СтандартнаяОбработка, ОбъектОтчет) Экспорт
	
	Если СтрокаОтбора = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Попытка
		
		Если СтрокаОтбора.ТипЗначения.Типы().Количество() = 1
		 И СтрокаОтбора.ТипЗначения.СодержитТип(Тип("СправочникСсылка.Субконто")) Тогда
			
			Если ОбъектОтчет.ИмяРегистраБухгалтерии = "Хозрасчетный" 
			 ИЛИ ОбъектОтчет.ИмяРегистраБухгалтерии = "Налоговый" Тогда
				НайденноеЗначение = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию(СтрокаОтбора.Представление, Истина);
			ИначеЕсли ОбъектОтчет.ИмяРегистраБухгалтерии = "Международный"
			 И Метаданные.ПланыВидовХарактеристик.Найти("ВидыСубконтоМеждународные") <> Неопределено Тогда
				НайденноеЗначение = ПланыВидовХарактеристик.ВидыСубконтоМеждународные.НайтиПоНаименованию(СтрокаОтбора.Представление, Истина);
			КонецЕсли;
			
			Если НайденноеЗначение <> Неопределено Тогда
				СтандартнаяОбработка = Ложь;
				ФормаВыбора = Справочники.Субконто.ПолучитьФормуВыбора(,Элемент,);
				ФормаВыбора.ПараметрОтборПоВладельцу = НайденноеЗначение;
				ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь;
				ФормаВыбора.Открыть();
				Возврат;
			КонецЕсли;
			
		КонецЕсли;
		
	Исключение
	КонецПопытки;
	
	// Принятая в конфигурации обработка работает только для равенства/неравенства
	Если СтрокаОтбора.ВидСравнения = ВидСравнения.Равно
	 ИЛИ СтрокаОтбора.ВидСравнения = ВидСравнения.НеРавно Тогда
		
		ТипЗначенияПоля = СтрокаОтбора.ТипЗначения;
		ОбъектОтчет.НачалоВыбораЗначенияСубконто(Элемент, СтандартнаяОбработка, ТипЗначенияПоля);
		
	КонецЕсли;	
	
	//***************************************  Модуль_ПодборСпискаЗначений  *****************************************//		
	Если ТипЗнч(Элемент.Значение)=Тип("СписокЗначений") Тогда	
		 Модуль_ПодборСпискаЗначений.ДополнительнаяОбработкаПодбораЗначения(СтрокаОтбора.Значение, СтандартнаяОбработка);
	КонецЕсли;
	//****************************************************************************************//		
	
	
КонецПроцедуры

Настройка Бухгалтерских отчетов

Примечание: Абсолютно ничего не мешает использовать процедуру "ДополнительнаяОбработкаПодбораЗначения " для изменения поведения любого поля ввода с типом "СписокЗначений" - достаточно разместить вызов в обработчике "НачалоВыбора".

Модификация поведения отчетов на основе механизма шаблон типового отчета (система компоновки данных)

Обмануть отчет, использующий шаблон типового отчета (описание присутствует на диске ИТС), несколько сложнее - мало кто будет пользоваться настройкой отборов в форме настройки структуры отчета (хотя и её поведение в общем случае стоит изменить). Скорее всего пользователь воспользуется быстрым отбором с панели пользователя или страницей отборов на этой же панели. А поскольку формы в общем случае у каждого отчета свои, то и как таковой формы для модификации не существует. Да и сама панель рисуется динамически. Но! Вся логика работы, так или иначе, заложена в модуле "ТиповыеОтчеты". Соответственно именно его и стоит модифицировать.

Ещё одна особенность в том, что нам нужен обработчик в форме отчета, а так как мы не имеем доступа к форме, то нам следует воспользоваться вместо обработчика методом формы с двумя параметрами (поскольку ровно столько должен иметь обработчик "НачалоВыбора") и ОБЯЗАТЕЛЬНО! вызывающим какую-либо процедуру или функция из модуля "ТиповыеОтчеты". Я использовал процедуру "ОбработкаВыбора" (она обязана присутствовать в модуле формы отчета для функционирования логики формирования шаблона типового отчета), которая вызывает процедуру "ОбработкаВыбораФормыОтчета" из модуля "ТиповыеОтчеты". Естественно нужно предоставить возможность нормального исполнения, а случай использования в качестве обработчика обрабатывать отдельно:

// Добавлено в обработчик "ОбработкаВыбораФормыОтчета" 

&НаКлиенте
Функция ОбработкаВыбораСпискаЗначенийИзТабличногоДокумента(ОтчетОбъект, ФормаОтчета, ЗначениеВыбора, Источник) Экспорт
  Если ТипЗнч(ЗначениеВыбора) = Тип("ПолеВвода") И ТипЗнч(Источник)=Тип("Булево") Тогда 
    Если ТипЗнч(ЗначениеВыбора.Значение)=Тип("СписокЗначений") Тогда 
      ДополнительнаяОбработкаПодбораЗначения(ЗначениеВыбора.Значение, Источник);
    КонецЕсли;
    Возврат Истина;
  Иначе
    Возврат Ложь;
  КонецЕсли; 
КонецФункции

Вызов процедуры из модуля "ТиповыеОтчеты"  происходит в процедуре " ОбработкаВыбораФормыОтчета": 

Процедура ОбработкаВыбораФормыОтчета(ОтчетОбъект, ФормаОтчета, ЗначениеВыбора, Источник) Экспорт  
  
  //********************************** Модуль_ПодборСпискаЗначений ******************************************// 
  Если Модуль_ПодборСпискаЗначений.ОбработкаВыбораСпискаЗначенийИзТабличногоДокумента( ОтчетОбъект, ФормаОтчета, ЗначениеВыбора, Источник) Тогда 
    Возврат; 
  КонецЕсли; 
  //************************************************************************************// 
... 

Наконец назначение обработчика выполняется так:

// Добавлено в обработчик  "УправлениеОтображениемПанелиПользователя"

&НаКлиенте
Процедура ПодключитьОбработчикВыбораСпискаИзТабличногоДокумента(ЭлементОтбор) Экспорт
	// Обычный отбор
	ЭлементОтбор.Колонки.ПравоеЗначениеДляКраткогоОтображенияЭлемента.ЭлементУправления.УстановитьДействие("НачалоВыбора",
		Новый Действие("ОбработкаВыбора"));
	ЭлементОтбор.Колонки.ПравоеЗначениеДляПодробногоОтображенияЭлемента.ЭлементУправления.УстановитьДействие("НачалоВыбора",
		Новый Действие("ОбработкаВыбора"));
	// Локальный отбор	
	ЭлементОтбор.Колонки.ПравоеЗначениеДляКраткогоОтображенияЭлементаЛокальногоОтбора.ЭлементУправления.УстановитьДействие("НачалоВыбора",
		Новый Действие("ОбработкаВыбора"));
	ЭлементОтбор.Колонки.ПравоеЗначениеДляПодробногоОтображенияЭлементаЛокальногоОтбора.ЭлементУправления.УстановитьДействие("НачалоВыбора",
		Новый Действие("ОбработкаВыбора"));
	// Главный отбор
	ЭлементОтбор.Колонки.ПравоеЗначениеДляПодробногоОтображенияЭлементаГлавногоОтбора.ЭлементУправления.УстановитьДействие("НачалоВыбора",
		Новый Действие("ОбработкаВыбора"));
КонецПроцедуры	

Вызов подключения в модуле "ТиповыеОтчеты" происходит в процедуре "УправлениеОтображениемПанелиПользователя":

Процедура УправлениеОтображениемПанелиПользователя(ФормаОтчета) Экспорт
		
  ЭлементыФормы = ФормаОтчета.ЭлементыФормы;
  //************************************  Модуль_ПодборСпискаЗначений  *************************************//  
  Модуль_ПодборСпискаЗначений.ПодключитьОбработчикВыбораСпискаИзТабличногоДокумента(ЭлементыФормы.Отбор);
  //*********************************************************************************//
...

Готово - теперь при выборе на панели пользователя (на странице Отбор, а не в быстрых отборах - для модификации поведения быстрых отборов см. прилагаемую конфигурацию)  в отборе списка значений будет вызываться внешняя обработка работу которой рассмотрим далее.

 Типовой отчет 

Внешняя обработка "Подбор списка значений"

Данная обработка принимает в качестве входных данных исходный список значений и позволяет редактировать его в табличном поле привычным образом. Единственной особенностью является кнопка "Из таблицы" при нажатии на которую отображается поле табличного документа в который и можно поместить скопированный список (или же загрузить его из файла, в том числе и из Excel ). При нажатии на кнопку "Получить список" происходит добавление данных из поля табличного документа в редактируемый список. Преобразование значений происходит по тому же алгоритму что используется в обработке "ЗагрузкаДанныхИзТабличногоДокумента" (с диска ИТС). Типы значений ограничены типом значения списка.

Для удобства также добавлена возможность получать данные из произвольного запроса к базе данных:

Произвольный запросРезультат произвольного запроса

 

 

Заключение

В качестве заключения следует отметить, что описанный алгоритм стал возможен лишь из-за стандартизированного подхода компании 1С к разработке стандартных отчетов для конфигураций. Печально то, что технологическая платформа не предоставляет возможность указания произвольной формы для редактирования списков значений. Это означает, что если Вам потребуется изменить поведение формы выбора списка значений в произвольном месте, то так или иначе придется вызвать и/или назначить обработчик для события "НачалоВыбора".  Но что делать когда его нет? Только изменить модуль формы... а если до него нет доступа, то ничего сделать уже нельзя  !!!

Прилагаемая конфигурация (выполнена на основе конфигурации "Универсальный отчет", редакция 1.0) позволяет более подробно изучить описанный алгоритм (точки вызова указаны в комментариях процедур и функций общего модуля "Модуль_ПодборСпискаЗначений" ), а также демонстрирует один из подходов к изменению типовых конфигураций - использованию общего модуля в качестве хранилища модификаций. При обновлении можно будет воспользоваться отчетом об изменении конфигурации и проконтролировать наличие вызовов процедур и функций из общего модуля в необходимых местах кода конфигурации. Просматривать отчет об изменении, где все модификации обозначены лишь вызовами процедур общего модуля гораздо удобнее, чем видеть абсолютно весь программный код этих модификаций. Кроме того, модификации стандартных форм прикладных объектов (добавление кнопок, полей и пр.) также можно оформить в виде процедур общего модуля (при этом их вызов как правило осуществляется в обработчике формы "ПриОткрытии"), но обсуждение данной темы выходит за рамки данной публикации.

Прилагаемая внешняя обработка является необходимым звеном алгоритма, но может быть модифицирована под различные нужды. Для разработчика возможно будут интересными некоторые механизмы, используемые в обработке:

  • Преобразование данных табличного документа (используется алгоритм из обработки  "ЗагрузкаДанныхИзТабличногоДокумента" ( диска ИТС));
  • Загрузка данных в поле табличного документа из файла Excel; 
  • Скрытие/Отображение панели с разделителем (обратите внимание на порядок установки привязок для элементов).

Выгрузка информационной базы (.dt) предоставляет возможность ознакомиться с работой рассмотренного алгоритма без внедрения его в существующую конфигурацию.

Список значений Отчеты Стандартные отчеты Табличный документ Excel

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122171    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7294    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3541    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2520 руб.

14.01.2013    177753    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99347    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

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

3000 руб.

27.08.2019    18116    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28110    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23604    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Evgeniy 102 22.11.18 15:06 Сейчас в теме
Обработка помогла, как раз нужно была возможность загружать из эксель в отборы отчета большой список артикулов.
Но по тестировании вылезли сразу же явные косяки.
Скачивал файл "Выгрузка" - там где база данных, возможно в файле Внешняя обработка "Подбор списка значений" таких ошибок нет, не проверял.

Список выявленных ошибок:
1) почему обработка внешняя? Гораздо проще было её загрузить внутрь конфигурации и обращаться к ней напрямую, что я и сделал.
2) ошибка кода когда найдено несколько значений - при таком случае выводилось сообщение что ничего не найдено, пришлось исправлять.
3) Ошибка загрузки с типом Строка
а) полученная строка трансформируется в дату
б) в списке значений не предусмотрены простейшие типы данных (число, булево, дата, строка) и в итоге при загрузке строк загружаются пустые строки.
4) Если возникает ошибка по этой нестандартной обработке перенаправил обращение к стандартной процедуре.
2. alexkutuzov 41 23.11.18 06:59 Сейчас в теме
Да, действительно обработку давно не обновлял.... описанные ошибки уже были исправлены, файлы обновил. Обработка внешняя для того чтобы можно было обновить её без необходимости обновления информационной базы, ну и плюс если она вдруг более не нужна то просто переименовываете её в справочнике внешних обработок и все работает как прежде....

Касательно опыта применения обработки - как правило её используют для отбора в отчетах по результатам других отчетов. Например, получают список заказов из отчета Продажи и переносят список этих заказов в отбор отчета... ну например Валовая прибыль. Значения уникально описывают заказ - всё прекрасно работает, но что если требуется загрузить не уникальные значения - номенклатуру, единицы измерения и прочее... да будет найдено несколько значений и обработка выдаст список для выбора значения, но если список огромный пользователь устанет выбирать значение для каждого элемента. Именно поэтому возникла необходимость сделать загрузку не из одной, а из двух колонок например "Код" и "Наименование". В общем случае отдельную колонку с кодом в любом отчете получить достаточно просто и её значения позволяют легко решить проблему с загрузкой не уникальных значений.
3. ipoloskov 162 24.04.20 14:36 Сейчас в теме
Для управляемых форм такое есть?
4. alexkutuzov 41 25.04.20 18:42 Сейчас в теме
5. ipoloskov 162 26.04.20 05:35 Сейчас в теме
(4) сделал для Бухгалтерии 3.0 в простом виде https://infostart.ru/public/1228575/
Оставьте свое сообщение