Доработка функции ОбщегоНазначения.ЗаменитьСсылки для автоматической чистки или свёртки табличных частей

Публикация № 902973

Разработка - Универсальные функции

замена ссылок общего назначения заменить ссылки ЗаменитьСсылки ОбщегоНазначения ОбщегоНазначения.ЗаменитьСсылки свертка табличной части документа

Стандартная обработка по замене дублей ругается на документ с неуникальными строками. Предполагается, что их нужно либо а) удалить, либо б) свернуть. Я немного модифицировал код функции ОбщегоНазначения.ЗаменитьСсылки, встроив в него вызов процедуры, переопределяемой в модуле менеджера соответствующего документа. И в этом модуле менеджера мы уже сами определяем - удалить или свернуть. Ну и вообще там чего хошь можно с этой коллекцией сделать - сам же ж процедуру пишешь...

В функции ОбщегоНазначения.ЗаменитьСсылки можно вставить вызов переопределяемых обработчиков событий по технологии как в БСП, переопределив их в модулях менеджеров этих требующих уникальности строк документов.

Суть метода быстрее всего понять из этого куска кода:

Функция ИзмененныеОбъектыПриЗаменеВОбъекте(ПараметрыВыполнения, МестоИспользования, ОбрабатываемыеСтроки)

Вместо вызова ЗаменитьВКоллекцииСтрок(...) в типовой вставляем наш кусок кода:

	// Табличные части
	Для Каждого Элемент Из Описание.ТабличныеЧасти Цикл
		СтандартнаяОбработка = Истина;
		Если МодульМенеджера <> Неопределено Тогда
			МодульМенеджера.ПриЗаменеВКоллекцииСтрок(
				"ТабличныеЧасти",
				Элемент.Имя,
				Объект,
				Объект[Элемент.Имя],
				Элемент.СписокПолей,
				ПарыЗамен,
				СтандартнаяОбработка);
		КонецЕсли;
			
		// несмотря на наличие вызова модуля - применяем стандартную обработку
		Если СтандартнаяОбработка Тогда
			ЗаменитьВКоллекцииСтрок(
				"ТабличныеЧасти",
				Элемент.Имя,
				Объект,
				Объект[Элемент.Имя],
				Элемент.СписокПолей,
				ПарыЗамен);
		КонецЕсли;
	КонецЦикла;

 

Конечно надо инициализировать МодульМенеджера. Я это делаю в том же модуле ОбщегоНазначения

Функция ИзмененныеОбъектыПриЗаменеВОбъекте(ПараметрыВыполнения, МестоИспользования, ОбрабатываемыеСтроки)
	МодульМенеджера = ПараметрыВыполнения.МодулиМенеджеровПриЗаменеВКоллекцииСтрок[ТипЗнч(Данные)];

Конечно надо инициализировать это соответствие, и пр...  (эту всю кухню смотрите в исходниках, про неё в статье читать скучно, не говоря о том чтобы писать)

[Не намного, но всё же] веселее писать про модуль менеджера документа. Вот пример для УстановкаЦенНоменклатуры:

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

Вот пример процедуры общего модуля ПоискИУдалениеДублей - это чтобы не писать в каждом модуле менеджера документа одно и то же - вынес случаи а) и б) в общий модуль:

Процедура УдалитьДублиВКоллекцииСтрок(ВидКоллекции, ИмяКоллекции, Объект, Коллекция, Знач СтруктураПолей, Знач ПарыЗамен) Экспорт
	
	// не представляю какие там бывают коллекции, но 
	Если Не СтруктураПолей.Свойство("Номенклатура") Тогда
		Возврат;
	КонецЕсли;
	
	РабочаяКоллекция = Коллекция.Выгрузить();
	ПараметрыОтбора = Новый Структура("Номенклатура");
	
	СоответствиеЦелевыхСсылок = ОбщегоНазначения.СоответствиеЗначенийСоответствия(ПарыЗамен);
	мСоответствиеЦелевыхСсылок = Новый Соответствие;
	
	Для каждого ЭлементЦелевыхСсылок Из СоответствиеЦелевыхСсылок Цикл
		
		ПараметрыОтбора.Номенклатура = ЭлементЦелевыхСсылок.Ключ;
		Если РабочаяКоллекция.НайтиСтроки(ПараметрыОтбора).Количество() > 0 Тогда
			мСоответствиеЦелевыхСсылок.Вставить(ЭлементЦелевыхСсылок.Ключ, Истина); // надо переносить данные, потому что из ОбщегоНазначения вернулось ReadOnly соответствие
		КонецЕсли;
		
	КонецЦикла;
	
	Модифицировано = Ложь;
	Для каждого Пара Из ПарыЗамен Цикл
	
		ЦелеваяСсылка = Пара.Значение;
		ПараметрыОтбора.Номенклатура = Пара.Ключ;
		НайденныеСтроки = РабочаяКоллекция.НайтиСтроки(ПараметрыОтбора);
		Н = НайденныеСтроки.Количество() - 1;
		Пока Н >= 0 Цикл
			ТекущаяСтрока = НайденныеСтроки[Н];
			Если Не мСоответствиеЦелевыхСсылок[ЦелеваяСсылка] = Истина Тогда
				// присваиваем вручную в первой встречной строке товара целевую ссылку
				//ЗарегистрироватьФактЗамены(Данные, СтрокаТовара.Номенклатура, ЦелеваяСсылка, "ТабличныеЧасти", "Товары", ТаблицаТоваров.Индекс(СтрокаТовара), "Номенклатура");
				ТекущаяСтрока.Номенклатура = ЦелеваяСсылка;
				мСоответствиеЦелевыхСсылок.Вставить(ЦелеваяСсылка, Истина);
			Иначе
				РабочаяКоллекция.Удалить(ТекущаяСтрока);
			КонецЕсли;
			
			Модифицировано = Истина;
			
		    Н = Н - 1;
		КонецЦикла;
	
	КонецЦикла;
	
	Если Модифицировано Тогда
		Коллекция.Загрузить(РабочаяКоллекция);
	КонецЕсли;
	
КонецПроцедуры

Какие там бывают коллекции - я до сих пор не представляю. Названия нужных ВидКоллекции ловил в отладчике.

Ещё есть элегантный кусок модуля ПоискИУдалениеДублейПереопределяемый, вот он:

#Область ПрограммныйИнтерфейс

// Определить объекты, в модулях менеджеров которых предусмотрена возможность параметризации 
// алгоритма поиска дублей с помощью экспортных процедур ПараметрыПоискаДублей, ПриПоискеДублей 
// и ВозможностьЗаменыЭлементов.
//
// Параметры:
//   Объекты - Соответствие - объекты, в модулях менеджеров которых размещены экспортные процедуры.
//       ** Ключ     - Строка - полное имя объекта метаданных, подключенного к подсистеме "Поиск и удаление дублей".
//                              Например, "Справочник.Контрагенты".
//       ** Значение - Строка - имена экспортных процедур, определенных в модуле менеджера.
//                              Могут быть указаны:
//                              "ПараметрыПоискаДублей",
//                              "ПриПоискеДублей",
//                              "ВозможностьЗаменыЭлементов".
//                              Каждое имя должно начинаться с новой строки.
//                              Если указана пустая строка, то в модуле менеджера определены все процедуры.
//++ Альберт -- Поиск и замена дублей. Переопределение замены ссылок в документах
//				"ПриЗаменеВКоллекцииСтрок"
//-- Альберт -- Поиск и замена дублей. Переопределение замены ссылок в документах
//
// Пример:
//  1. В справочнике определены все процедуры:
//  Объекты.Вставить(Метаданные.Справочники.Контрагенты.ПолноеИмя(), "");
//
//  2. Определены только процедуры ПараметрыПоискаДублей и ПриПоискеДублей:
//  Объекты.Вставить(Метаданные.Справочники.ЗадачиПроекта.ПолноеИмя(), "ПараметрыПоискаДублей
//                   |ПриПоискеДублей");
//
Процедура ПриОпределенииОбъектовСПоискомДублей(Объекты) Экспорт
	
	//++ Альберт -- Поиск и замена дублей. Переопределение замены ссылок в документах
	Объекты.Вставить(Метаданные.Документы.УстановкаЦенНоменклатуры.ПолноеИмя(), "ПриЗаменеВКоллекцииСтрок");
	Объекты.Вставить(Метаданные.Документы.РегистрацияЦенНоменклатурыПоставщика.ПолноеИмя(), "ПриЗаменеВКоллекцииСтрок");
	Объекты.Вставить(Метаданные.Документы.РегистрацияОстатковНоменклатурыПоставщика.ПолноеИмя(), "ПриЗаменеВКоллекцииСтрок");
	Объекты.Вставить(Метаданные.Документы.ЗаказПоставщику.ПолноеИмя(), "ПриЗаменеВКоллекцииСтрок");
	Объекты.Вставить(Метаданные.Документы.ПоступлениеТоваровУслуг.ПолноеИмя(), "ПриЗаменеВКоллекцииСтрок");
	//-- Альберт -- Поиск и замена дублей. Переопределение замены ссылок в документах
	
КонецПроцедуры

#КонецОбласти

Во вложении один файл с исходниками, разбитый по областям - именам тех модулей, куда надо вставлять код.

P.S. Друзья, я это никогда нигде не внедрял, (на своей фирме оно как-то само создалось) поэтому могут быть ляпы типа "забыл ещё модуль такой-то". Не судите строго, спрашивайте, догружу недостающие :)

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

Наименование Файл Версия Размер
all.bsl

.bsl 50,18Kb
12.09.18
1
.bsl 1 50,18Kb 1 Скачать

Специальные предложения

Оставьте свое сообщение

См. также

Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример Промо

Практика программирования Универсальные функции v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

19.01.2018    59115    rpgshnik    31    

Библиотека программного изменения формы (УФ)

Инструментарий разработчика Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

07.08.2020    4557    BuriyLesha    17    

Сохранение настроек колонок

Практика программирования Работа с интерфейсом Универсальные функции v8 Абонемент ($m)

Сохранение настроек колонок табличных полей. Получение имени формы из модуля формы. Для обычных форм.

1 стартмани

10.07.2020    1027    Arc    1    

Универсальные функции: разложение произвольной строки адреса в структуру

Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

1 стартмани

30.12.2019    3905    vik070777    10    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

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

26.05.2017    49310    DarkAn    86    

Работа с графической схемой в объектной модели DOM

Универсальные функции v8 v8::УФ Абонемент ($m)

Пример кода для работы с графической схемой в объектной модели DOM, платформа 8.3.12.

1 стартмани

04.06.2019    8021    botokash    19    

Корректировка движений документа

Универсальные функции v8 1cv8.cf Абонемент ($m)

Корректировка движений документа после его проведения по типовому алгоритму.

1 стартмани

26.05.2019    4796    rutadmeen    0    

Программное формирование картинки в 1С:Предприятие 8.3.9 (ПотокВПамяти / ЗаписьДанных)

Универсальные функции v8 1cv8.cf Абонемент ($m)

В статье представлен код программного формирования картинки (двоичные данные) без всяких внешних компонент, без формирования строки Base64, используя лишь встроенные механизмы 1С предприятие 8.3.9 (объекты ПотокВПамяти и ЗаписьДанных). Сам по себе код формирования картинки не несёт ничего нового. Всё описано в википедии. Захотелось попробовать новые методы, но никак не доходитили руки. В приложении обработка практически с этим же кодом.

1 стартмани

16.05.2019    9469    yku    7    

Ускорение для Клиент-Банка Промо

Банковские операции Обмен с банком Универсальные функции Банковские операции v8 1cv8.cf Абонемент ($m)

У вас много платежей и клиент-банк долго их читает? Есть проверенная практикой идея, как это ускорить.

1 стартмани

08.10.2012    23755    Yashazz    15    

Альтернатива внешним печатным формам. ЗУП 3.1

Печатные формы документов Универсальные функции Зарплата Практика программирования Зарплата Разработка v8 v8::СПР ЗУП3.x Абонемент ($m)

Как в ЗУП 3.1.8 отказаться от внешних печатных форм и расширением увеличить количество полей, доступных при редактировании макетов, для изменения печатных форм Т1, Т5, Т8 и аналогичные пользователями.

1 стартмани

30.01.2019    14630    Mogilnikova    3    

Использование подсистемы БСП "Заполнение объектов"

Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем) v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

23.11.2018    25857    ids79    23    

Пропорциональное распределение в запросе

Универсальные функции Практика программирования v8 1cv8.cf Абонемент ($m)

Периодически в работе сталкиваюсь с задачей пропорционального распределения сумм в запросе. Ситуация усложняется, когда распределяемые суммы изначально не известны и определяются в процессе выполнения запроса. Эта статья один из примеров решения такой задачи.

1 стартмани

28.06.2018    11993    invertex    7    

Сохранение реквизитов и табличных частей объектов в XML Промо

Обмен через XML Универсальные функции v8 1cv8.cf Абонемент ($m)

Пример того, как можно сохранять и загружать объекты 1С методами встроенных объектов ЗаписьXML и ЧтениеXML.

1 стартмани

25.11.2011    21937    saiten    21    

Заполнение справочника с изображениями элементами по умолчанию

Практика программирования Обмен через XML Универсальные функции v8 Абонемент ($m)

Пример одного из решений, как можно заполнить справочник с изображениями значениями по умолчанию включая сами изображения. Сами изображения взяты из программы MapSource 6.16.3. Данные для загрузки хранятся в макете в формате XML.

1 стартмани

26.03.2018    8714    Kim1C    0    

Проверка таблицы на дублирование строк (ТаблицаЗначений, ТабличнаяЧасть) и получение массива таких строк

Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Функция для проверки дублирования строк в ТаблицеЗначений или ТабличнойЧасти. Также, если необходимо, возвращает массив задублированных строк (можно обработать).

1 стартмани

05.02.2018    11412    uri1978    27    

Работа с кодами - числами, датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных

Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Поддерживается преобразование Кодов на основе Алфавитов, в том числе ''блочных" кодов - состоящих из блоков (подстрок) одинаковой длины (например: 8, 16, 32-битные коды, Хэши и т.п.). Функции доступны на Клиенте и на Сервере. Демо-примеры сделаны на управляемых формах. Тестировалось на платформах серии 8.3.10.

1 стартмани

28.11.2017    7539    newold2    1    

Размеры управляемой формы

Практика программирования Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

08.10.2017    27176    json    9    

Пример универсальной функции для создания схемы компоновки данных

Практика программирования Универсальные функции v8::СКД 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

12.01.2017    32594    dbachinsky    32    

Функция преобразования промежутка времени в строку

Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Функция предназначена для преобразования промежутка времени в строку с разбивкой по годам, дням, часам, минутам, секундам.

1 стартмани

23.09.2016    10093    vovant    1    

1С 8.2 переключение раскладки клавиатуры (с помощью dynwrap.dll)

Разработка внешних компонент Универсальные функции v8 Абонемент ($m)

Функция для автоматического переключения раскладки клавиатуры. (с помощью dynwrap.dll) Дабы не переключать каждый раз (при вводе информации в разных полях) с "Rus" на "Eng", можно эту работу возложить на функцию.

1 стартмани

22.05.2013    15230    Serg23ru    24    

Конвертер Даты из числового формата Excel

Загрузка и выгрузка в Excel Универсальные функции v8 1cv8.cf Абонемент ($m)

Столкнувшись с проблемой загрузки в 1С из Excel Даты-Времени в числовом формате к удивлению не нашел нигде подобных формул. Может потому что они уж слишком банальны, а может потому что они "тайное знание посвященных". В общем, эта обработка пример конвертации Excel <=> 1C

1 стартмани

17.04.2013    18556    vova196    5    

Точка Актуальности для 1С 8

Практика программирования Универсальные функции v8 УТ10 Абонемент ($m)

Все знают, что такое ТА для 1с 7.7 И этот механизм отсутствует в 1С 8. Но многие бухгалтера привыкли к нему. Почему бы тогда его не реализовать?

1 стартмани

18.12.2012    20664    Sykoku    28    

Ограничение на проведение реализаций по группе доступности складов в УТ 10.3

Практика программирования Универсальные функции Учет ТМЦ Учет ТМЦ v8 УТ10 Абонемент ($m)

В стандартной конфигурации УТ 10.3, настройка "группы доступности складов" не накладывает ограничения на продажи с определённых складов. Группа доступности складов позволяет наложить ограничение лишь на автоматическое размещение товаров в заказе покупателей, т.е. менеджер может вручную выбрать размещение и совершить продажу. Данная доработка исправляет эту ситуацию.

12.04.2012    12306    pusix    8    

Синхронизация с сервером 1С во внешнем соединении

Внешние источники данных Универсальные функции v8 1cv8.cf Абонемент ($m)

Позволяет установить время удаленного SQL-сервера на компьютере при выполнении обмена через Внешнее соединение

1 стартмани

27.09.2011    13458    sml    6    

Как превратить линейно-периодический отчёт в многолинейно-периодический (в платформах 8.х)

Универсальные функции Анализ учета v8 1cv8.cf Абонемент ($m)

Навеяно http://infostart.ru/public/90001/ - решение на основе пользовательских полей в СКД

1 стартмани

27.09.2011    17134    e.kogan    35