8.х Проверка совпадений из таблицы значений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем GreenSH, 18 май 2015.

  1. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    Добрый день.
    Не могу реализовать при сохранении проверку совпадений из таблицы значений справочника с другими данными таблицы значений того же справочника.

    Подробно: Имеется справочник ЖурналОбщихРабот. Каждая строка справочника - это рабочий день, в таблице значений которого указываются работы этого дня.
    Как сделать проверку совпадений таблицы значений текущего дня с таблицами значений предыдущих дней?

    Код:
    Процедура ПриЗаписи(Отказ)
            Журнал = Справочники.ЖурналОбщихРабот.Выбрать();
               
        Для Каждого ТекущаяСтрока ИЗ Журнал.Работы Цикл
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    ЖурналОбщихРаботРаботы.НаименованиеРаботы,
            |    ЖурналОбщихРаботРаботы.ПКОт,
            |    ЖурналОбщихРаботРаботы.ПКДо,
            |    ЖурналОбщихРаботРаботы.Ссылка,
            |    ЖурналОбщихРаботРаботы.Дата
            |ИЗ
            |    Справочник.ЖурналОбщихРабот.Работы КАК ЖурналОбщихРаботРаботы
            |ГДЕ
            |    ЖурналОбщихРаботРаботы.НаименованиеРаботы = &НаименованиеРаботы
            |    И ЖурналОбщихРаботРаботы.ПКОт < &ПКОт И ЖурналОбщихРаботРаботы.ПКДо > &ПКОт
            |    ИЛИ ЖурналОбщихРаботРаботы.НаименованиеРаботы = &НаименованиеРаботы
            |   И ЖурналОбщихРаботРаботы.ПКОт < &ПКДо И ЖурналОбщихРаботРаботы.ПКДо > &ПКДо";
    
        Запрос.УстановитьПараметр("НаименованиеРаботы", ТекущаяСтрока.НаименованиеРаботы);
        Запрос.УстановитьПараметр("ПКДо", ТекущаяСтрока.ПКДо);
        Запрос.УстановитьПараметр("ПКОт", ТекущаяСтрока.ПКОт);
    
        Результат = Запрос.Выполнить();
       
       
        Если Результат > 0 Тогда
           Сообщить("ЖОПА");
           Отказ = истина;
        КонецЕсли;
        КонецЦикла;
    КонецПроцедуры
    --- Объединение сообщений, 18 май 2015 ---
    Пишет : Итератор для значения не определен
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Результат = Запрос.Выполнить().Выбрать();
    Результат.Количество(), а не ЖОПА.
  3. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    Хорошая поправка, вот только что делать с Итератором? Дело даже до запроса не доходит.
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Журнал.Работы - это что ?
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    ну там наверное вместо
    Для Каждого ТекущаяСтрока ИЗ Журнал.Работы Цикл

    просто

    Пока Журнал.Следующий() цикл
    --- Объединение сообщений, 18 май 2015 ---
    Вы хоть в синтаксис помощнике смотрите примеры
    Уже не обсуждаем что запрос в цикле
  6. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    Это таблица значений справочника.
    --- Объединение сообщений, 18 май 2015 ---
    Журнал.Следующий() же не перебирает значения Таблицы значений.
  7. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Да, но вот здесь же у Вас
    Журнал = Справочники.ЖурналОбщихРабот.Выбрать();
    Журнал - это выборка и что бы по не двигаться - следующий, а там уже тогда

    Код:
    Пока Журнал.Следующий() цикл
    Для Каждого ТекущаяСтрока ИЗ Журнал.Работы Цикл
    
    конецЦикла;
    КонецЦикла;
  8. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Так таблицы значений и перебираются по-другому.
  9. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    А что делать с запросом в цикле? Массив?
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Запросом в цикле мало кто пользуется :D
  11. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    Выход есть в моей ситуации?? Как проверить на совпадения-то?
  12. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну возможно запросмо проверить, но я вам так от руки не напишу т.к конфа у вас своя.
    Тут надо еще определиться что считать совпадением если за один и тот же день выполняли одинаковые виды работ или они должны быть еще в одинаковом порядке или как ?
  13. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Например можно так
    Код:
    Процедура ПриЗаписи(Отказ)
    
        Запрос = Новый Запрос;
        Запрос.Текст = "
        |ВЫБРАТЬ
        |    1
        |ИЗ
        |    Справочник.ЖурналОбщихРабот.Работы КАК ЖурналОбщихРаботРаботы
        |ГДЕ
        |    НЕ ЖурналОбщихРаботРаботы.Ссылка = &Ссылка
        |    И ЖурналОбщихРаботРаботы.НаименованиеРаботы = &НаименованиеРаботы
        |    И &ПКОт МЕЖДУ ЖурналОбщихРаботРаботы.ПКОт И ЖурналОбщихРаботРаботы.ПКДо
        |    И &ПКДо МЕЖДУ ЖурналОбщихРаботРаботы.ПКОт И ЖурналОбщихРаботРаботы.ПКДо
        |";
       
        Запрос.УстановитьПараметр("НаименованиеРаботы", СокрЛП(Ссылка.НаименованиеРаботы));
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Запрос.УстановитьПараметр("ПКДо",   Ссылка.ПКДо);
        Запрос.УстановитьПараметр("ПКОт",   Ссылка.ПКОт);
       
        Результат = Запрос.Выполнить();
       
        Если НЕ Результат.Пустой() Тогда
            Сообщить("В базе обнаружена существующая аналогичная запись !");
            Отказ = Истина;
        КонецЕсли;
    
    КонецПроцедуры
  14. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    Каким образом этот код будет проверять несколько строк из таблицы? Не вижу перехода......или не понимаю
  15. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    скорее всего второе -Artist-
  16. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Привет,
    Поскольку приходится догадываться о структуре данных вашей конфигурации поэтому получается нечто похожее на пост №13

    Думаю более правильный вариант примерно будет таким :
    Код:
    Процедура ПриЗаписи(Отказ)
    
        Запрос = Новый Запрос;
        Запрос.Текст = "
        |ВЫБРАТЬ
        |    ТаблицаРабот.НаименованиеРаботы,
        |    ТаблицаРабот.ПКОт,
        |    ТаблицаРабот.ПКДо
        |ПОМЕСТИТЬ ВТ_ТаблицаРабот
        |ИЗ
        |    &ТаблицаРабот КАК ТаблицаРабот
        |;
        |ВЫБРАТЬ
        |    1
        |ИЗ
        |    Справочник.ЖурналОбщихРабот.Работы КАК ЖурналОбщихРаботРаботы
        |    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        |        ВТ_ТаблицаРабот
        |    ПО   ВТ_ТаблицаРабот.НаименованиеРаботы = ЖурналОбщихРаботРаботы.НаименованиеРаботы
        |     И ( ВТ_ТаблицаРабот.ПКОт МЕЖДУ ЖурналОбщихРаботРаботы.ПКОт И ЖурналОбщихРаботРаботы.ПКДо
        |     ИЛИ ВТ_ТаблицаРабот.ПКДо МЕЖДУ ЖурналОбщихРаботРаботы.ПКОт И ЖурналОбщихРаботРаботы.ПКДо)
        |ГДЕ
        |    НЕ ЖурналОбщихРаботРаботы.Ссылка = &Ссылка
        |";
    
        Запрос.УстановитьПараметр("Ссылка",       Ссылка);
        Запрос.УстановитьПараметр("ТаблицаРабот", Ссылка.Работы.Выгрузить());
    
        Результат = Запрос.Выполнить();
    
        Если НЕ Результат.Пустой() Тогда
            Сообщить("В базе обнаружена существующая аналогичная запись !");
            Отказ = Истина;
        КонецЕсли;
    
    КонецПроцедуры
    
    Идея алгоритма -
    скажем создали новый элемент справочника, как то его заполнили, и даже кликнули кнопку записать.
    Процедура отрабатывает когда элемент уже записан в базу, но транзакция записи еще не завершена, т.е. у нас есть ссылка на объект.
    берем табличную часть элемента справочника, загоняем ее в виртуальную таблицу, а далее просто внутренним соединением к общей выборке по табличной части к существующим записям в базе, с соответствующими условиями.
    Если в результате соединения, что то есть то результат запроса не пустой, значит в табличной части нашей записи есть работы которые попадают в период ранее выполненных аналогичных работ.
  17. TopicStarter Overlay
    GreenSH
    Offline

    GreenSH Опытный в 1С

    Регистрация:
    1 май 2015
    Сообщения:
    53
    Симпатии:
    0
    Баллы:
    26
    Огромное спасибо. Буду разбираться. Таких подробностей в книгах не видел. Везде база...

Поделиться этой страницей