Найти дубли в таблице значений 1с

Обновлено: 06.07.2024

Данная тема не нова, но подобные вопросы периодически возникают у начинающих программистов. Здесь приведены примеры работающих запросов в 1С .

1. Процесс поиска дублей в 1С, используя группировку

Первый запрос выбирает ИНН, которые встречаются более 1 раза и помещает их в виртуальную таблицу 1С.

Во втором запросе находим тех контрагентов, ИНН которых входит в виртуальную таблицу 1С, и готовим вывод с удобной группировкой.

2. Поиск соединением таблиц в 1С

Несмотря на изящность решения, такой запрос выполняется гораздо дольше, чем с группировкой в 1С 8,3.

Даже вариация первого варианта с соединением таблиц 1С выполняется дольше.

Рис. 3 Поиск дублей соединением таблиц – не самый быстрый, но эффективный способ Рис. 3 Поиск дублей соединением таблиц – не самый быстрый, но эффективный способ

Тем не менее, это работает.

3. Поиск дублей как комбинации реквизитов

Например, ищем контрагентов, имеющих одинаковые ИНН и КПП.

Рис. 4 Поиск дублей как комбинации одинаковых реквизитов в 1С Рис. 4 Поиск дублей как комбинации одинаковых реквизитов в 1С

Идея, аналогична первому варианту. Создаем виртуальную таблицу, содержащую повторяющиеся пары ИНН/КПП. Отбираем Контрагентов, у которых пара значений ИНН/КПП встречается в виртуальной таблице 1С . Готовим удобный вывод, добавляя ИТОГИ. Поле Ключ создано для удобства вывода итоговых строк.

4. Использование библиотеки стандартных подсистем в типовых решениях 1С

В типовых решениях используется Библиотека стандартных подсистем , в которой присутствует подсистема « Поиск и удаление дублей ».

Чаще всего пользователи используют одноименную обработку данной подсистемы, которая размещена в «Администрирование» (или «НСИ и Администрирование») → Обслуживание → Корректировка данных → Поиск и удаление дублей 1С» .

К функциям подсистемы можно обращаться и программно. Они расположены в общем модуле ПоискИУдалениеДублей . Например:

Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.

//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(<Идентификатор>, <Тип>, <Длина>, <Точность>, <Заголовок>, <Ширина>, <Формат>, <Положение>)

Добавление строк в таблицу значений

Перебор строк таблицы значений

Сортировка таблицы значений

Поиск в таблице значений

Синтаксис: НайтиЗначение(<Знач>,<Строка>,<Колонка>)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр <Строка>, то поиск производится только по заданной строке
Если указан параметр <Колонка>, то поиск производится только по заданной колонке

Итоги и группировка таблицы значений

//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть

Удаление строк и колонок из таблицы значений

ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.

В этом случае я рекомендую использовать следующий прием:

А вот еще один правильный алгоритм, предложенный Wlad:

Замечание(Туц). Предыдущий вариант не совсем правильный. Случай, когда последняя строка попадает под условие и в условии идёт обращение к строке таблицы, приводит к ошибке. Т.е. происходит попытка чтения для строки 0.

И ещё вариант, предложенный Туц:

Замечание (vligm). А я использую такой алгоритм (это, собственно говоря, шаблон):

Таблица значений как элемент диалога

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

Методы УстановитьЗначение и ПолучитьЗначение

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

Синтаксис: УстановитьЗначение(<Строка>,<Колонка>,<Знач>)
Синтаксис: ПолучитьЗначение(<Строка>,<Колонка>)

Распечатать

ZIP-архив Создание  0
Для того чтобы записать файлы в ZIP-архив необходимо выполнить несколько простых действий: * Создать архив с необходимыми параметрами, в который будут помещаться файлы. * Поместить в архив необходимые файлы. * Записать архив. Создание объекта За ZIP-архив Чтение  0
Для того чтобы прочитать файлы из ZIP-архива необходимо выполнить несколько простых действий: - Открыть необходимый архив - Распаковать файлы Создание объекта ЧтениеZIPФайла можно осуществить двумя путями - создать инициализированный объект или Автоматизация обмена данных используя обработку "Универсальный обмен данными в формате XML"  10
Автоматизация обмена между базами используя обработку " Универсальный обмен данными в формате XML" В основу данной публикации положены найденные мною материалы по cозданию обмена между двумя базами с использованием обработки " Универсальный обме Журнал транзакций для базы данных "db_buh" переполнен. Причина: "LOG_BACKUP". HRESULT=80040E14  29
При обновлении бухгалтерии, на этапе сохранения, получил следующую ошибку: Каталог не обнаружен v8srvr://sql/acc_main/configsave/e0666db2-45d6-49b4-a200-061c6ba7d569.6b9d6525-ee94-4e13-b73d-82d3e8e8441d по причине: Каталог не обнаружен Confi Журнал транзакций заполнен. HRESULT=80040E14  0
Ошибка СУБД: Microsoft OLE DB Provider for SQL Server: Журнал транзакций для базы данных " zup" заполнен. Чтобы обнаружить причину, по которой место в журнале не может быть повторно использовано, обратитесь к столбцу log_reuse_wait_desc таблицы s Посмотреть все результаты поиска похожих

Еще в этой же категории

Как быстро вывести таблицу значений в табличный документ?  88
ТекстЗапроса = " ВЫБРАТЬ * ИЗ Справочник.Пользователи" ; ЗапросаДанных = Новый Запрос(ТекстЗапроса); РезЗапроса = ЗапросаДанных.Выполнить().Выгрузить(); ТабДокумент = Новый ТабличныйДокумент; Построитель = Новый Построит Создание Таблицы значений и описание типов значений ее колонок  28
ТаблицаПериодов = Новый ТаблицаЗначений; ТаблицаПериодов.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число")); ТаблицаПериодов.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций")); ТаблицаП Удаление строк Таблицы Значений  27
// 1. Удаление строк согласно условию НулевыеСтроки = ТаблицаПослеПодмен.НайтиСтроки(Новый Структура(" Сумма" ,0)); Для каждого СтрокаТаблицы Из НулевыеСтроки Цикл ТаблицаПослеПодмен.Удалить(СтрокаТаблицы) КонецЦикла; // Нужно оставить стр Как скопировать, выгрузить данные из одной таблицы значений в другую?  11
Как скопировать или выгрузить данные из одной таблицы значений в другую таблицу значений? 1. Добавление, копирование строк из одной таблицы значений в другую таблицу значений: Для каждого СтрокаТЗ Из Таблица1 Цикл ЗаполнитьЗначенияСвойств(Таблица Объединение 2 таблиц значений  10
// Объединить 2 таблицы значения // тзОсновная - таблица к которой будут изменяться данные // тзПрисоединяемая - таблица из которой будут браться данные // стОтборОдинаковых - стурктура со списком полей по которым определяеться одинаковость запис Посмотреть все в категории Работа с Таблицей Значений


1С 8.3 Удаление дублирующих строк в Таблице значений


Данная функция принимает таблицу значений (с любой структурой), а возвращает обработанную таблицу с удаленными одинаковыми строками. В параметр КолонкиТЗ можно передать колонки (через запятую), по которым нужно выполнять проверку и удаление строк-дублей. Если параметр пустой, то метод сворачивает ТЗ по всем колонкам.

Функция УдалениеДублирующихСтрокТЗ ( ТЗ , КолонкиТЗ = "" ) Экспорт

Если ПустаяСтрока ( КолонкиТЗ ) Тогда // свертка ТЗ по всем колонкам

Для Каждого ТЗКолонка Из ТЗ . Колонки Цикл
КолонкиТЗ = КолонкиТЗ + ?( ПустаяСтрока ( КолонкиТЗ ), "" , "," ) + ТЗКолонка . Имя ;
КонецЦикла;
КопияТЗ = ТЗ . Скопировать ();
КопияТЗ . Свернуть ( КолонкиТЗ );

КолонкиЗапроса = "ТЗ." + СтрЗаменить ( КолонкиТЗ , "," , ",ТЗ." );

Запрос = Новый Запрос ;
Запрос . Текст = "ВЫБРАТЬ
| " + КолонкиЗапроса + "
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + СтрЗаменить ( КолонкиЗапроса , "ТЗ." , "ВТ_ТЗ." ) + "
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
|" ;

Запрос . УстановитьПараметр ( "ТЗ" , ТЗ );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда
ТаблицаЗапроса = РезультатЗапроса . Выгрузить ();

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

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

НоваяСтрокаТЗ = КопияТЗ . Добавить ();
ЗаполнитьЗначенияСвойств ( НоваяСтрокаТЗ , СтрокаОтбораТЗ );
Прервать;

КонецЦикла;
КонецЦикла;
Иначе
КопияТЗ = ТЗ ;
КонецЕсли;

ТЗ = Новый ТаблицаЗначений ;

// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ТЗ . Колонки . Добавить ( "Животное" , НовСтрока );
ТЗ . Колонки . Добавить ( "Размер" , НовСтрока );
ТЗ . Колонки . Добавить ( "Цвет" , НовСтрока );

// Добавляем строки в таблицу значений
Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "большой" ;
Стр . Цвет = "зеленый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "красный" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "розовый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "фиолетовый" ;

УдалениеДублирующихСтрокТЗ ( ТЗ , "Животное,Цвет" );



ТЗ = Новый ТаблицаЗначений ;

// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ТЗ . Колонки . Добавить ( "Животное" , НовСтрока );
ТЗ . Колонки . Добавить ( "Размер" , НовСтрока );
ТЗ . Колонки . Добавить ( "Цвет" , НовСтрока );

// Добавляем строки в таблицу значений
Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "большой" ;
Стр . Цвет = "зеленый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить (); //дубль
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "розовый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

Стр = ТЗ . Добавить (); //дубль
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

УдалениеДублирующихСтрокТЗ ( ТЗ , "Животное,Цвет" );



ТЗ = Новый ТаблицаЗначений ;

// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ТЗ . Колонки . Добавить ( "Животное" , НовСтрока );
ТЗ . Колонки . Добавить ( "Размер" , НовСтрока );
ТЗ . Колонки . Добавить ( "Цвет" , НовСтрока );

// Добавляем строки в таблицу значений
Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "большой" ;
Стр . Цвет = "зеленый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить (); //дубль
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "розовый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "черный" ;

Стр = ТЗ . Добавить (); //дубль т.к. размер не учитывается
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

Читайте также: