[РЕШЕНО] Регистр сведений. Выполнить контроль перед записью.

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

  1. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Добрый день.
    Есть регистр сведений, для простоты с одним измерением (А) и одним ресурсом (Б).
    Необходимо перед записью новой записи в регистр проверять наличие дублей. Проверка должна быть и при программной записи, и при интерактивной, поэтому пытаюсь сделать в Модуле набора записей, в процедуре "ПередЗаписью()".
    Значение измерения А, я могу получить в процедуре: "ЭтотОбъект.Отбор.А"
    Как получить значение ресурса Б, в этой процедуре?
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Сделай Б так же измерением, если нужна уникальность по обоим значениям.
  3. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Вадим, нет, это вариант не подходит. Уникальность нужна только при определенных значениях измерений. Не написал об этом, т.к. не хотел усложнять вопрос.
    Задачу надо постараться решить именно в том в иде, в котором она есть. :)
  4. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    В чем проблема написать запрос к регистру с отборам по нужным полям и проверить результат на пустой(), если не пустой - значит дубль
  5. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Проблема с получением значений для отбора. Как мне в Модуле набора записей, в процедуре ПередЗаписью() получить значение реквизита "Б" записи, которую я пытаюсь сейчас записать?
  6. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Код:
    ========================================================
    "Выбрать 0 Из РегистрСведений.<ИмяРегистра> Где А = &А И Б = &Б"
    ....
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    .....
    КонецЕсли;
    ========================================================
    
    ========================================================
    ОтветСтруктура = РегистрыСведений.<ИмяРегистра>.Получить(Новый Структура("А", ЗначениеА));
    
    Если ОтветСтруктура.Б = ЗначениеБ Тогда
    .......
    КонецЕсли;
    ========================================================
    
    Svb нравится это.
  7. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
  8. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну я бы делал это все - через подписку на событие того же набора записей РС. там из источника тянуть
    Svb нравится это.
  9. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    nomad_irk, спасибо. Похоже рабочий вариант, можно наверное вторую часть тоже через запрос сделать.
    Draco, спасибо, попробую. Если получится, этот вариант будет самым оптимальным.
  10. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Запись - это элемент коллекции ЭтотОбъект в модуле набора записей.
    Код:
    Для Каждого Стр ИЗ ЭтотОбъект Цикл
    
    Б = Стр.Б;
    
    КонецЦикла
    Svb нравится это.
  11. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Ситуация такая же, как и в процедуре "ПриЗаписи()".
    --- Объединение сообщений, 30 июл 2015 ---
    Да, это то, что нужно! Буду знать.
  12. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну понятно, что такая же просто правильнее не типовые модули портить, а через подписку, там источник, а у источника как уже написал nomad_irk есть коллекция движений
  13. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Вот что получилось:
    Код:
        МассивАртикулов = Новый Массив;
        Для Каждого Запись из ЭтотОбъект Цикл       
            МассивАртикулов.Добавить(Запись.Артикул77);                
        КонецЦикла;
       
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    СУММА(1) КАК Счетчик,
                       |    АртикулыНоменклатуры.Артикул77
                       |ИЗ
                       |    РегистрСведений.АртикулыНоменклатуры КАК АртикулыНоменклатуры
                       |ГДЕ
                       |    АртикулыНоменклатуры.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
                       |    И АртикулыНоменклатуры.Артикул77 В(&МассивАртикулов)
                       |
                       |СГРУППИРОВАТЬ ПО
                       |    АртикулыНоменклатуры.Артикул77
                       |
                       |ИМЕЮЩИЕ
                       |    СУММА(1) > 1";
        Запрос.УстановитьПараметр("МассивАртикулов", МассивАртикулов);
                                               
        Результат = Запрос.Выполнить().Выбрать();
        Пока Результат.Следующий() Цикл
            Отказ = Истина;
            Сообщить("Обнаружено повторение артикула ["+Результат.Артикул77+"]: данные не записаны!");
        КонецЦикла;
    
    Спасибо, всем. Сам бы промучался пол дня, и в итоге сделал через Ж.
    IceBeerG нравится это.

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