8.х Проверка гос номера

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

  1. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    Приветствую ,задача была поставлена такая. При добавление нового элемента справочника сделать проверку гос номера и если в справочнике существуют элементы с такими же гос номером вывести сообщение об ошибке.
    помогите с кодом)

    Процедура ПередЗаписью(Отказ)
    Запрос = новый запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ОсновныеСредства.ГосНомер
    |ИЗ
    | Справочник.ОсновныеСредства КАК ОсновныеСредства";
    Выборка = Запрос.Выполнить().Выбрать();


    Пока Выборка.Следующий() цикл
    Если Выборка = Этаформа.ГосНомер тогда
    //ЭтотОбъект.Записать(Ложь);
    Сообщить("Запись документа " + Выборка + "невозможна , гос номер заполнен неверно!!! " );
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
  2. Thelearning
    Offline

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

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Сразу в запросе устанавливайте ограничения на гос номер. Если результат пустой - все ок, если нет - ошибка.
  3. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Да , почему сразу в запрос не передать в качестве параметра го сномер и не проверить
    используте в запросе ПОДОБНО, на форуме писалось
  4. rshakiro
    Offline

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

    Регистрация:
    17 мар 2011
    Сообщения:
    2.236
    Симпатии:
    144
    Баллы:
    104
    ну как-то по символьно нужно сравнивать по ходу... + А 111 АА может быть с русским или английским шрифтом
  5. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    по идее код написан правильно,но в условие не попадает,это ,собственно и хотелось бы выяснить.
    Например я скопирую гос номер из элемента и вставлю его в поле гос номера другого элемента,по логике в цикле будет проходить проверка и он должен будет вывести сообщение об ошибке,но этого не происходит
  6. Thelearning
    Offline

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

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Код неверно написан. В условии должно быть
    Код:
    Если Выборка.ГосНомер = ЭтаФорма.ГосНомер
       //....
    КонецЕсли;
  7. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Ну и СокрЛП бы не помешал на всякий случай, вдруг кто пробелы поставил
    Thelearning нравится это.
  8. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    На счет Выборка.ГосНомер полностью согласен,уже изменил ,но возникла новая проблема


    Запрос = новый запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ОсновныеСредства.ГосНомер,
    | ОсновныеСредства.Ссылка
    |ИЗ
    | Справочник.ОсновныеСредства КАК ОсновныеСредства";
    Выборка = Запрос.Выполнить().Выбрать();
    КоличесвтоДокуентов = 0;
    Пока Выборка.Следующий() цикл
    Если не Этаформа.ГосНомер <> Выборка.ГосНомер тогда
    КоличесвтоДокуентов = КоличесвтоДокуентов + 1;
    Сообщить("Количество справочников с таким же гос номером " + КоличесвтоДокуентов + " и это тот самый справочник ");
    Иначе
    Продолжить;
    КонецЕсли;
    Если КоличесвтоДокуентов > 1 тогда
    Сообщить( "Запись справочника невозможна ,имеются еще справочник с таким же гос номером !!! " + Выборка.Ссылка );
    ЭтотОбъект.Записать(отказ);
    КонецЕсли;
    КонецЦикла;

    Ошибка!!
    {Справочник.ОсновныеСредства.Форма.ФормаЭлементаУАТ.Форма(1098)}: Слишком много фактических параметров
    ЭтотОбъект.Записать(отказ);
  9. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Этот код в какоф процедуре помещен?
    Логично было бы поместить ПередЗаписью или ПриЗаписи (подписку на событие опускаю) итам тогда же есть Отказ, который можно просто ложь поставить

    А так не совсем понятно ЭтотОбъект - какой тип?
    Я так понимаю что это вообще форма
  10. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    да это форма элемента, код прописан в процедуре "Процедура ПередЗаписью(Отказ)"
    --- Объединение сообщений, 18 май 2015 ---
    В отладчике получается он доходит до " ЭтотОбъект.Записать(отказ);" и вылетает сообщение об ошибке.
    Я в 1 с только начинаю работать ,может использовать какой - то другой метод отказа от записи?
  11. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    ну вместо ЭтотОбъект.Записать(отказ)
    Напишите просто Отказ=Истина;
    RuslanKhanow нравится это.
  12. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    Еще один вопросик возник) Вот например когда я проверяю по условию
    ИначеЕсли КоличесвтоОбъектов > 1 тогда
    Сообщить("Были найдены элементы с таким же гос номером!! Запись невозможна!!!! У вас " + КоличесвтоОбъектов + " объекта с таким же гос номером " );
    Отказ = Истина;
    то получается что я могу создать 2 объекта с таким же гос номером, что в свою очередь не правильно,как мне записать условие?

    Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
    | ОсновныеСредства.ГосНомер
    |ИЗ
    | Справочник.ОсновныеСредства КАК ОсновныеСредства
    |ГДЕ
    | ОсновныеСредства.ГосНомер ПОДОБНО &ГосНомер";
    Запрос.УстановитьПараметр("ГосНомер",Этаформа.ГосНомер);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    //количество объектов с таким же гос номером
    КоличесвтоДокуентов = 0;
    Пока Выборка.Следующий() Цикл
    Если не Этаформа.ГосНомер <> Выборка.ГосНомер тогда
    КоличесвтоОбъектов = КоличесвтоОбъектов + 1;
    КонецЕсли;
    КонецЦикла;
    Если Результат.Пустой() Тогда
    //Сообщить("Элементов с таким же гос номером не найдены, запись текущего гос номера возможна!!");
    Отказ = Ложь;
    ИначеЕсли КоличесвтоОбъектов > 1 тогда
    Сообщить("Были найдены элементы с таким же гос номером!! Запись невозможна!!!! У вас " + КоличесвтоОбъектов + " объекта с таким же гос номером " );
    Отказ = Истина;
    КонецЕсли;
  13. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    я не совсем понял у Вас есть запрос а потом проверка зачем там еще чт то

    Код:
    Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
    | ОсновныеСредства.ГосНомер
    |ИЗ
    | Справочник.ОсновныеСредства КАК ОсновныеСредства
    |ГДЕ
    | ОсновныеСредства.ГосНомер ПОДОБНО &ГосНомер";
    Запрос.УстановитьПараметр("ГосНомер",Этаформа.ГосНомер);
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда 
    Отказ = Истина;
    КонецЕсли;
    т.е обратились к справочнику выбрали от туда номера похожие если есть такие тогда отказ в записи
  14. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    А если я захочу изменить уже имеющийся элемент справочника? Тогда получается что записать я его не смогу,поскольку
    Если Не Результат.Пустой() Тогда
    Отказ = Истина;
    поэтому я поставил второе условие
    ИначеЕсли КоличесвтоОбъектов > 1 тогда
    Сообщить("Были найдены элементы с таким же гос номером!! Запись невозможна!!!! У вас " + КоличесвтоОбъектов + " объекта с таким же гос номером " );
    Отказ = Истина;
    Но возникла очередная проблема(( Если я например создаю новый элемент справочника или захочу изменить существующий и ,например, буду использовать не уникальный гос номер ,то запись пройдет,поскольку это условие
    ИначеЕсли КоличесвтоОбъектов > 1 тогда
    Сообщить("Были найдены элементы с таким же гос номером!! Запись невозможна!!!! У вас " + КоличесвтоОбъектов + " объекта с таким же гос номером " );
    Отказ = Истина;
    проверяет только записанные элементы,но вот если будет создан уже 3 элемент справочника с таким же гос номером то запись не пройдет.
  15. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Ну в запросе тогда поставьте условие на отбор что выбирать все кроме этого элемента
  16. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    Не подскажете как это сделать,был бы очень признателен)
  17. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Что то вроже
    Запрос.Текст ="ВЫБРАТЬ
    | ОсновныеСредства.ГосНомер
    |ИЗ
    | Справочник.ОсновныеСредства КАК ОсновныеСредства
    |ГДЕ
    | ОсновныеСредства.ГосНомер ПОДОБНО &ГосНомер
    |И ОсновныеСредства.Ссылка<>&ТекущийЭлемент";
    Запрос.УстановитьПараметр("ГосНомер",Этаформа.ГосНомер);
    Запрос.УстановитьПараметр("ТекущийЭлемент",СсылкаНатекущйЭлемент);

    Ну просто этот код надо делать при услоии что Не ЭтоНовый() т.к когда создаете ссылки то еще нет
    RuslanKhanow нравится это.
  18. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    Вот получился готовый рабочий код,если кому будет надо)
    //khanow\\
    Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
    | ОсновныеСредства.ГосНомер,
    | ОсновныеСредства.Ссылка
    |ИЗ
    | Справочник.ОсновныеСредства КАК ОсновныеСредства
    |ГДЕ
    | ОсновныеСредства.ГосНомер ПОДОБНО &ГосНомер
    | И ОсновныеСредства.Ссылка <> &Ссылка";
    Запрос.УстановитьПараметр("ГосНомер",Этаформа.ГосНомер);
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Если Результат.Пустой() Тогда
    Сообщить("Элементы с таким же гос номером не найдены, запись текущего гос номера возможна!!");
    Отказ = Ложь;
    Иначе
    Сообщить("Гос номер не уникален!!");
    Отказ = Истина;
    КонецЕсли;
    //Khanow\\

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