Имя: Пароль:
1C
1С v8
Нужно определить, какие строки ТЗ отсутствуют в ТЧ справочника
0 ADV
 
30.09.24
15:45
В БСП есть метод КоллекцииИдентичны, но он возвращает Булево. Как написать самому вроде понятно, но может имеется типовой метод?
1 Волшебник
 
30.09.24
15:46
Запросом с условием
ГДЕ поле НЕ В (ВЫБРАТЬ поле ИЗ &тз)
2 ADV
 
30.09.24
16:29
(1) в ТЗ и ТЧ справочника 3 поля
3 Волшебник
 
30.09.24
16:30
(2) сверните в одно составное
4 mastodont
 
30.09.24
16:32
(3) где (поле1, поле2, поле3) НЕ в (выбрать поле1, поле2, поле3 из....)
5 DiMel_77
 
30.09.24
16:58
(2) А какая разница? Все равно запросом.
Как то так:

ВЫБРАТЬ
    ТЗ.Поле1 КАК Поле1,
    ТЗ.Поле2 КАК Поле2,
    ТЗ.Поле3 КАК Поле3
ПОМЕСТИТЬ ВТ_ТЗ
ИЗ &ТаблицаЗначений КАК ТЗ
;
ВЫБРАТЬ
    ТЗ.Поле1 КАК Поле1,
    ТЗ.Поле2 КАК Поле2,
    ТЗ.Поле3 КАК Поле3
ИЗ ВТ_ТЗ КАК ТЗ
ЛЕВОЕ СОЕДИНЕНИЕ <ТвойОбъект>.<ИмяТЧ> КАК ТЧ
ПО
    ТЗ.Поле1 = ТЧ.Поле1
    И ТЗ.Поле2 = ТЧ.Поле2
    И ТЗ.Поле3 = ТЧ.Поле3
ГДЕ
    ТЧ.Ссылка = &Ссылка
    И ТЧ.НомерСтроки ЕСТЬ NULL
6 Волшебник
 
30.09.24
17:12
Решение от ChatGPT 4o:
Функция НайтиОтсутствующиеСтроки(ТаблицаЗначений, СсылкаНаЭлементСправочника)

    // Создаем запрос для получения строк из справочника
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
         |   ТабличнаяЧасть.Поле1,
         |   ТабличнаяЧасть.Поле2,
         |   ТабличнаяЧасть.Поле3
         |ИЗ
         |   Справочник.Спр.ТЧ КАК ТабличнаяЧасть
         |ГДЕ
         |   ТабличнаяЧасть.Ссылка = &Ссылка";

    // Устанавливаем параметр Ссылка
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаЭлементСправочника);

    // Выполняем запрос и получаем результат в виде таблицы значений
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    // Подготовим таблицу для хранения отсутствующих строк
    ОтсутствующиеСтроки = Новый ТаблицаЗначений;
    ОтсутствующиеСтроки.Колонки.Добавить("Поле1");
    ОтсутствующиеСтроки.Колонки.Добавить("Поле2");
    ОтсутствующиеСтроки.Колонки.Добавить("Поле3");

    // Перебираем строки в таблице значений
    Для Каждого СтрокаИзТЗ Из ТаблицаЗначений Цикл
        // Проверяем, есть ли такая строка в таблице результата запроса
        СтрокиНайденные = РезультатЗапроса.НайтиСтроки(
            Новый Структура("Поле1, Поле2, Поле3", 
               СтрокаИзТЗ.Поле1, 
               СтрокаИзТЗ.Поле2, 
               СтрокаИзТЗ.Поле3));
        
        // Если строка не найдена, добавляем ее в список отсутствующих
        Если СтрокиНайденные.Количество() = 0 Тогда
            НоваяСтрока = ОтсутствующиеСтроки.Добавить();
            НоваяСтрока.Поле1 = СтрокаИзТЗ.Поле1;
            НоваяСтрока.Поле2 = СтрокаИзТЗ.Поле2;
            НоваяСтрока.Поле3 = СтрокаИзТЗ.Поле3;
        КонецЕсли;
    КонецЦикла;

    // Возвращаем таблицу отсутствующих строк
    Возврат ОтсутствующиеСтроки;

КонецФункции
7 ADV
 
30.09.24
17:13
(3) (4) (5)  - спасибо!
8 PR
 
30.09.24
17:21
(0) Если в ТЧ одна строка, а в ТЗ две такие же идентичные строки, то это вторая отсутствует или нет?
9 Волшебник
 
30.09.24
17:27
А не проще ли так:

ТЧ.Очистить();
ТЧ.Загрузить(ТЗ);
10 ADV
 
30.09.24
17:30
(9) нет, имеющиеся в ТЧ строки удалять нельзя
11 PR
 
30.09.24
17:30
(9) А зачем предварительно очищать?
12 Волшебник
 
30.09.24
17:31
(10) Вам видней
(11) Для надёжности
13 PR
 
30.09.24
17:31
(10) То есть нужны только новые?
Ну так выбирай запросом из ТЗ, где поля не в выбрать поля из ТЧ справочника
14 ADV
 
30.09.24
17:31
(8) я предварительно сворачиваю ТЗ
15 ADV
 
30.09.24
17:34
(13) я так и сделал, но коллеги продолжают предлагать варианты, за что им (вам) еще раз спасибо
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший