Здравствуйте. У меня есть созданный АктПриема, в котором есть реквизиты , куда вносятся данные клиента - фамилия, телефон и пр. Поле Клиент имеет тип СправочникКонтрагенты. Для того, чтобы выписать АктПриема новому клиенту, вначале вызывается справочник и там все вписывается. Затем из справочника уже выбирается вновь созданный клиент и заполняется сама форма документа. Это не всегда удобно. Вопрос следующий. Можно ли заполнить соответствующие поля документа, а при проведении документа автоматически создать новый элемент справочника Контрагенты? То есть, занести в справочник данные о новом клиенте? И можно ли при этом сохранить возможность вносить в документ данные клиента из справочника? Спасибо!
Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Клиент.Новый(); //создается новая запись в справочнике контрагентов
Клиент.Наименование=Наименование //ф.и.о из документа накладная
Клиент.Телефон=Телефон //№ телефона из документа накладная
Клиент.Записать(); //записываем новую запись в справочник Контрагенты.
Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Поиск=Клиент.НайтиПоНаименованию(НовыйКлиент,,1); //поиск на точное соответствие
Если Поиск=0 тогда
Клиент.Новый(); //создается новая запись в справочнике контрагентов
Клиент.Наименование=Наименование //ф.и.о из документа накладная
Клиент.Телефон=Телефон //№ телефона из документа накладная
Клиент.Записать(); //записываем новую запись в справочник Контрагенты.
КонецЕсли;
Только необходимо учесть, что любая ошибка или неправильное правописание приведет к созданию нового клиента в дополнение к уже существующему. Получите двойников со всеми вытекающими обстоятельствами.
Pepe @ Сегодня, 11:42
,
Для минимизации таких случаев можно осуществлять поиск по номеру телефона. Попутный вопрос - а можно ли сделать так, чтобы по окончании ввода, скажем, телефона, автоматически включался поиск и при нахождении клиента в справочнике автоматически подставлял в поля документа его данные, а при ненахождении создавалась бы новая запись в справочнике? Есть в языке подходящий оператор? Или нужно создавать отдельную кнопку с нужной процедурой?
ZUBR @ Сегодня, 12:40
, да, еще, чуть не забыл. Как прописать поиск по номеру телефона? ПоНаименованию - это имя, фамилия. Имена могут быть одинаковые, фамилии тоже, да и не каждый хочет сообщать фамилию. А номер телефона почти уникален .
ZUBR @ Сегодня, 15:52
,
НайтиПоРеквизиту(<?>,,);
Синтаксис:
НайтиПоРеквизиту(<ИмяРеквизита>,<Значение>,<ФлагГлобальногоПоиска>)
Назначение:
Найти элемент справочника по значению реквизита.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<ИмяРеквизита> - строка с наименованием реквизита;
<Значение> - значение реквизита для поиска;
<ФлагГлобальногоПоиска> - флаг поиска:
0 - поиск выполняется в пределах подчинения справочника,
1 - поиск выполняется по всему справочнику.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''.
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.
Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Поиск=Клиент.НайтиПоПоРеквизиту(Телефон,НомерТелефонаИЗАктаПриема,1);
Если Поиск=0 Тогда
//Добавляется запись в справочник Контрагенты
КонецЕсли;
andrew76 @ Сегодня, 16:45
,
Вдогонку : На вкладке Формула указывайте имя процедуры со скобками.Например: ПроверкаКонтрагентов()
Господа, спасибо за ответы. Они очень ценны для меня. Теперь мне нужно над этим поработать. О результатах отпишусь. Спасибо, что вы есть!
Поиск=Клиент.НайтиПоРеквизиту("Телефон",НомерТелефонаИЗАктаПриема,1);
volodya1122 @ Сегодня, 9:47
,
тогда уж условие видимости лучше менять после поиска: нашелся клиент по номеру - подставили значение в реквизит и сделали видимым, если нет - видимое текстовое поле. И тоже прописать при открытии
Возник еще один вопрос. При автоматической записи в Справочник.Контрагенты все клиенты заносятся в корневой каталог. Но там есть папка Покупатели. Как сделать, чтобы клиенты заносились туда?Я пробовал прописать СоздатьОбъект("Справочник.Контрагенты.Покупатели") , но это не работает.
Для меня сейчас это не критично, но не хочется потом переносить и сортировать по папкам.
Спасибо!
ZUBR @ Сегодня, 21:58
,
Нужно заполнить реквизит "Родитель" у создаваемого элемента справочника. Реквизит с типом Контрагент, т.е. например так:
Родитель = СоздатьОбъект("Справочник.Контрагенты");
Родитель.НайтиПоНаименованию("Покупатели");
// если не найдена группа, создадим
Если Родитель.Выбран() = 0 Тогда
Родитель.НоваяГруппа();
Родитель.Наименование = "Покупатели";
Родитель.ПолнНаименование = "Покупатели";
Родитель.Записать();
КонецЕсли;
Контр.Родитель = Родитель.ТекущийЭлемент();
Макс1С @ 20.11.19, 22:44
,
не получилось. Я не очень понял, куда тулить родителя. записывает в корень. Привожу часть кода, понимаю, что не правильный, совсем неправильный. Исправьте, пожалуйста. Для того, чтобы сделать, надо понимать. Мне не понятно. Спасибо.
Если Кл=0 Тогда
Мистер = СоздатьОбъект("Справочник.Контрагенты");
Родитель=СоздатьОбъект("Справочник.Контрагенты");
Родитель.НайтиПоНаименованию("Покупатели");
Мистер.Новый();
Мистер.Наименование=Клиент;
Мистер.ПолнНаименование=Клиент; //ф.и.о из документа накладная
Мистер.Телефоны=Телефон; //№ телефона из документа накладная
Мистер.ПочтовыйАдрес=Адрес;
Мистер.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо;
Мистер.ВалютаВзаиморасчетов = Константа.БазоваяВалюта;
Мистер.ВалютаКредита = Константа.БазоваяВалюта;
Мистер.ВалютаКредитаПоставщика = Константа.БазоваяВалюта;
Если ПустаяСтрока(Телефон)=0 Тогда
Мистер.Записать(); //записываем новую запись в справочник Контрагенты.
Контрагент = Родитель.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
ZUBR @ Сегодня, 3:53
,
Доброе утро !
Если Кл=0 Тогда
Мистер = СоздатьОбъект("Справочник.Контрагенты");
Мистер.НайтиПоНаименованию("Покупатели");
Род=Мистер.ТекущийЭлемент();
Мистер.Новый();
Мистер.Родитель=Род;
Мистер.Наименование=Клиент;
Мистер.ПолнНаименование=Клиент; //ф.и.о из документа накладная
Мистер.Телефоны=Телефон; //№ телефона из документа накладная
Мистер.ПочтовыйАдрес=Адрес;
Мистер.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо;
Мистер.ВалютаВзаиморасчетов = Константа.БазоваяВалюта;
Мистер.ВалютаКредита = Константа.БазоваяВалюта;
Мистер.ВалютаКредитаПоставщика = Константа.БазоваяВалюта;
Если ПустаяСтрока(Телефон)=0 Тогда
Мистер.Записать(); //записываем новую запись в справочник Контрагенты.
КонецЕсли;
КонецЕсли;
Мистер = СоздатьОбъект("Справочник.Контрагенты");
Мистер.НайтиПоНаименованию("Покупатели");
Род=Мистер.ТекущийЭлемент(); //получаем ссылку на запись Группы
Мистер.Новый();
Мистер.Родитель=Род; //при записи в справочник сопоставляем со ссылкой на Группу
andrew76 @ Сегодня, 6:01
,
andrew76 @ Сегодня, 6:01
,
у меня в модуле формы введена переменная Кл. При введении в акт приема телефона клиента осуществляется поиск его по справочнику Контрагенты. Если такой телефон уже есть, тогда в документ автоматически подставляется клиент из справочника и переменной Кл присваивается 1. Если же такого телефона в справочнике нет, тогда переменной Кл присваивается 0 и при проведении документа в справочник заносятся данные нового клиента из документа АктПриема. После чего Кл присваивается 1. Переменная введена для того, чтобы не записывать в справочник одинаковых клиентов каждый раз при проведении документа.
andrew76 @ 06.12.19, 8:40
,
нет еще, руки не дошли. Отпишусь обязательно.
ZUBR @ Сегодня, 14:52
,
все сделал. Все работает. Правда, мне не совсем понятно. Но работает))
Спасибо за помощь.
Мистер = СоздатьОбъект("Справочник.Контрагенты");
Мистер.НайтиПоНаименованию("Покупатели"); //ищем группу справочника "Покупатели"
Род=Мистер.ТекущийЭлемент(); // в переменную Род записываем ссылку на запись группы "Покупатели"
Мистер.Новый();
Мистер.Родитель=Род; //при записи в справочник нового контрагента указываем ссылку на Группу "Покупатели"
//Свойство элемента справочника Родитель это и есть Группа - в нашем случае "Покупатели"
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua