Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 мая 2024, 22:36

Моя Конфигурация

Автор CosmicBoy, 10 фев 2013, 21:26

0 Пользователей и 1 гость просматривают эту тему.

sadovod

Цитата: CosmicBoy от 14 фев 2013, 21:58. зачем там "Не"...
Потому, что конструкция Справочники.Извещение.НайтиПоНаименованию(ТекущийОбъект.Наименование).Пустая() возвращает Истина, если
элемента с таким наименованием нет, а нам нужно - наоборот, вот поэтому и ставим НЕ - это, кстати, не просто НЕ, это логический оператор отрицания.
Вам непременно нужно почитать азы по основам программирования, найдите какой-нибудь учебник по Паскалю или Бейсику...
Цитата: CosmicBoy от 14 фев 2013, 21:58надо найти не только по наименованию но и по реквизиту.
Есть ещё синтакс-помощник, вам обязательно нужно научиться им пользоваться.

CosmicBoy

Да вроде с zx spectrum я дружил :nhsrm:
Добавлено: 16 фев 2013, 17:03


Цитата: sadovod от 14 фев 2013, 21:31
Тогда, лучше вот что... Ваш код править не будем (хотя можно и его довести до работоспособности), а напишем-ка всё по-другому :)
Самый оптимальный вариант (лучше сразу привыкать к правильным решениям) заключается в проверке корректности введённых на форме данных
в специальном обработчике события формы, а именно ПередЗаписьюНаСервере(). Почему так, тема отдельного разговора... Итак:
В редакторе формы правой кн.мышки на корневом элементе "Форма" вызываем контекстное меню и выбираем События -> ПередЗаписьюНаСервере,
попадаем в нужное место кода. Там пишем
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    ЕстьТакойЭлемент = НЕ Справочники.Извещение.НайтиПоНаименованию(ТекущийОбъект.Наименование).Пустая();
    Если ЕстьТакойЭлемент Тогда
        Сообщить("Элемент с таким наименование уже есть!!!");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры


Проблема с этим кодом. Если запись в справочнике открыть и попытаться сохранить также выпадает эта ошибка/сообщение, т.е. открывать и редактировать записи не получается.

Dethmontt

НЕ претендует на Истину
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ТекущийОбъект.ЭтоНовый() Тогда   
    ЕстьТакойЭлемент = НЕ Справочники.Извещение.НайтиПоНаименованию(ТекущийОбъект.Наименование).Пустая();
    Если ЕстьТакойЭлемент Тогда
        Сообщить("Элемент с таким наименование уже есть!!!");
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

sadovod

Да-а, жирный у меня оказался баг :). Разумеется, необходима проверка, что элемент - новый...

CosmicBoy

Еще одна проблема.
Если запись была сделана с наименованием допустим "Наименование-200", а потом попытаться сделать запись с наименованием "Наименование-20" выдаст сообщение что такой элемент уже есть. Я так понял поиск работает не на полную уникальность, а на совпадение ( 

sadovod

Читаем, что написано в синтакс-помощнике:
ЦитироватьНайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
Параметры:
<Наименование> (обязательный)
Тип: Строка.
Строка, содержащая искомое наименование.
<ТочноеСоответствие> (необязательный)
Тип: Булево.
Определяет режим поиска по полному соответствию.
Поиск будет успешным, если строка поиска: в случае значения параметра Ложь - будет соответствовать левой части наименования; в случае значения параметра Истина - будет полностью совпадать с наименованием (за исключением "хвостовых" пробелов в наименовании).
Значение по умолчанию: Ложь
<Родитель> (необязательный)
Тип: СправочникСсылка.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
<Владелец> (необязательный)
Тип: СправочникСсылка.

Dethmontt

Совершенно верно! И это отруливается вторым параметром метода НайтиПоНаименованию
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ТекущийОбъект.ЭтоНовый() Тогда
    Если НЕ Справочники.Извещение.НайтиПоНаименованию(ТекущийОбъект.Наименование,ИСТИНА).Пустая() Тогда
        Сообщить("Элемент с таким наименование уже есть!!!");
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

CosmicBoy

Спасибо. Да синтакс-помощник рулит, но не всегда там все понятно :wacko:
Но сейчас понятно :)

CosmicBoy

Уф мозг потихоньку закипает от 1С =)
Вопросы:
-Представленная переменная в модуле вне функции и процедуры видна в других модулях?
-В модуле управляемого приложения не работают обращения к справочникам и т.д.
вобщем не работает у меня в модуле эта функция как пример:
Функция ОбаКорпуса()                                                         // запись справочника "Получатель"  "№3 и №108"
ДваКорпуса = справочники.Получатель.НайтиПоНаименованию("№3 и №108");
Возврат ДваКорпуса;
КонецФункции


-Убивают таблицы, а вернее ширина таблиц. Они постоянно разъезжаются, а когда сдвигаешь колонки то последняя колонка становится оооочень широкой, как "поджать" последнюю колонку, да и как настроить вообще ширену колонок т.к. выставление ее ширины в редакторе формы мало помогает.

sadovod

>> -Представленная переменная в модуле вне функции и процедуры видна в других модулях?
Скорее всего, речь идёт о модуле формы? Будет видна в клиентском контексте, если она объявлена как экспортная, например вот так -
&НаКлиенте
Перем X Экспорт;
>> -В модуле управляемого приложения не работают обращения к справочникам и т.д.
Да не работают, потому что модуль управляемого приложения компилируется исключительно на клиенте, а методы Найти... работают только на сервере.
Доступность методов описана в синтакс-помощнике.
>> -Убивают таблицы, а вернее ширина таблиц...
Честно говоря, почти всегда оставляю все размеры элементов управляемых форм по умолчанию, ведь но то они и управляемые, по идее система сама оптимально всё выстроит...

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск