Версия для печати темы (https://pro1c.org.ua/index.php?s=37058dab6bff15b02ea3c1e8727ce06e&showtopic=55000)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Как создать новый элемент справочника из документа? 1с 7.7 конф 7.7.003

Автор: ZUBR 03.11.19, 2:12

Здравствуйте. У меня есть созданный АктПриема, в котором есть реквизиты , куда вносятся данные клиента - фамилия, телефон и пр. Поле Клиент имеет тип СправочникКонтрагенты. Для того, чтобы выписать АктПриема новому клиенту, вначале вызывается справочник и там все вписывается. Затем из справочника уже выбирается вновь созданный клиент и заполняется сама форма документа. Это не всегда удобно. Вопрос следующий. Можно ли заполнить соответствующие поля документа, а при проведении документа автоматически создать новый элемент справочника Контрагенты? То есть, занести в справочник данные о новом клиенте? И можно ли при этом сохранить возможность вносить в документ данные клиента из справочника? Спасибо!

Автор: andrew76 03.11.19, 4:47

ZUBR @ Сегодня, 5:12 * ,

Цитата(ZUBR @ 03.11.19, 5:12) *
а при проведении документа автоматически создать новый элемент справочника Контрагенты


Доброе утро !
Можно.Код такой примерно :

Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Клиент.Новый();  //создается новая запись в справочнике контрагентов
Клиент.Наименование=Наименование //ф.и.о из документа накладная
Клиент.Телефон=Телефон //№ телефона из документа накладная
Клиент.Записать();   //записываем новую запись в справочник Контрагенты.


Можно еще продумать проверку на поиск уже существующего клиента в справочнике Контрагентов.
Т.е. новую запись добавлять , только если такого клиента нет в справочнике.

Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Поиск=Клиент.НайтиПоНаименованию(НовыйКлиент,,1);   //поиск на точное соответствие
Если Поиск=0 тогда
       Клиент.Новый();  //создается новая запись в справочнике контрагентов
       Клиент.Наименование=Наименование //ф.и.о из документа накладная
       Клиент.Телефон=Телефон //№ телефона из документа накладная
       Клиент.Записать();   //записываем новую запись в справочник Контрагенты.
КонецЕсли;

Автор: Pepe 03.11.19, 11:42

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

Автор: ZUBR 03.11.19, 12:52

Pepe @ Сегодня, 11:42 * ,
Для минимизации таких случаев можно осуществлять поиск по номеру телефона. Попутный вопрос - а можно ли сделать так, чтобы по окончании ввода, скажем, телефона, автоматически включался поиск и при нахождении клиента в справочнике автоматически подставлял в поля документа его данные, а при ненахождении создавалась бы новая запись в справочнике? Есть в языке подходящий оператор? Или нужно создавать отдельную кнопку с нужной процедурой?


ZUBR @ Сегодня, 12:40 * , да, еще, чуть не забыл. Как прописать поиск по номеру телефона? ПоНаименованию - это имя, фамилия. Имена могут быть одинаковые, фамилии тоже, да и не каждый хочет сообщать фамилию. А номер телефона почти уникален .

Автор: andrew76 03.11.19, 13:45

ZUBR @ Сегодня, 15:52 * ,


НайтиПоРеквизиту(<?>,,);
Синтаксис:
НайтиПоРеквизиту(<ИмяРеквизита>,<Значение>,<ФлагГлобальногоПоиска>)
Назначение:
Найти элемент справочника по значению реквизита.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<ИмяРеквизита> - строка с наименованием реквизита;
<Значение> - значение реквизита для поиска;
<ФлагГлобальногоПоиска> - флаг поиска:
0 - поиск выполняется в пределах подчинения справочника,
1 - поиск выполняется по всему справочнику.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''.
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.


Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Поиск=Клиент.НайтиПоПоРеквизиту(Телефон,НомерТелефонаИЗАктаПриема,1);

Если Поиск=0 Тогда
       //Добавляется запись в справочник Контрагенты
КонецЕсли;


Цитата(ZUBR @ 03.11.19, 15:52) *
Попутный вопрос - а можно ли сделать так, чтобы по окончании ввода, скажем, телефона, автоматически включался поиск и при нахождении клиента в справочнике автоматически подставлял в поля документа его данные, а при ненахождении создавалась бы новая запись в справочнике?


Можно.На свойствах поля ввода номера телефона (на форме) найдите вкладку Дополнительно.В поле "Формула" пропишите имя процедуры (имя придумайте сами).и в модуле пропишите заготовку процедуры с таким же именем.Подставте в текст процедуры вышеуказанные примеры поиска.

Автор: Pepe 03.11.19, 15:10

Цитата(ZUBR @ 03.11.19, 13:52) *
А номер телефона почти уникален

Необходим шаблон для ввода. Можно автоматически подставлять "+38" или вводить без кода страны с кодом оператора. Тогда будет уникальность.

Автор: andrew76 03.11.19, 16:21

andrew76 @ Сегодня, 16:45 * ,

Вдогонку : На вкладке Формула указывайте имя процедуры со скобками.Например: ПроверкаКонтрагентов()

Автор: ZUBR 03.11.19, 17:11

Господа, спасибо за ответы. Они очень ценны для меня. Теперь мне нужно над этим поработать. О результатах отпишусь. Спасибо, что вы есть! 32000000.gif icon_beer17.gif

Автор: ZUBR 03.11.19, 21:36

Цитата(Pepe @ 03.11.19, 15:10) *
Клиент=СоздатьОбъект("Спрвочник.Контрагенты");
Поиск=Клиент.НайтиПоПоРеквизиту(Телефон,НомерТелефонаИЗАктаПриема,1);

Если Поиск=0 Тогда
       //Добавляется запись в справочник Контрагенты
КонецЕсли;

Спасибо, в принципе, все получается. В приведенном Вами коде есть одна техническая неточность - первый параметр должен быть взят в кавычки. То есть, строка будет выглядеть
Поиск=Клиент.НайтиПоРеквизиту("Телефон",НомерТелефонаИЗАктаПриема,1);

Это я уточнил для тех, кто, как и я, пока мелко плавает в этом деле. Спасибо.


Как я уже написал ранее, все получилось. Или почти все. Есть еще одна небольшая, но надоедливая проблемка. У меня в акте приема реквизит Клиент имеет тип Справочник.Контрагенты. С кнопкой для выбора клиента из справочника. Можно ли, сохраняя возможность выбора клиента из справочника, получить возможность заполнять непосредственно поле реквизита Клиент на форме? Если я меняю тип на строку, тогда теряется возможность выбирать клиентов из справочника. И появляются еще кое-какие проблемы, в которых я еще не разобрался. Например, в ранее созданных актах приема вместо имен клиентов появляются двузначные числа.
А если я оставляю тип реквизита Клиент - Справочник.Контрагенты, тогда я не могу вводить непосредственно имя клиента в поле на форме... Если эта проблема решаема, подскажите, пожалуйста. Не хочется вводить дополнительное поле ввода. Спасибо.

Автор: andrew76 04.11.19, 2:52

ZUBR @ Сегодня, 0:36 * ,

Цитата(ZUBR @ 04.11.19, 0:36) *
Не хочется вводить дополнительное поле ввода

Скорее всего без этого не обойтись.Дополнительное текстовое поле -Ф.И.О. для поиска клиента в справочнике.
Поиск по телефону или по фамилии будет ?

Автор: volodya1122 04.11.19, 9:47

Цитата(andrew76 @ 04.11.19, 2:52) *
Не хочется вводить дополнительное поле ввода. Спасибо.


В 1С7 нема так як в 1С8 "Составной тип реквизита". Еякщо дуже хочеться і вибір з справочника и ручне введення, то в всеодно прийдеться вводити два реквізита. Можна зробити ще так: ці два реквізита розмістити один над одним (один реквізит закриває інший) і по умові керувати видимістю потрібного реквізиту. Саму умову реалізувати у вигляді флажка, або переключателя (по замовчуванню поставити значення те яке частіше використовується).

Автор: Макс1С 04.11.19, 10:14

volodya1122 @ Сегодня, 9:47 * ,
тогда уж условие видимости лучше менять после поиска: нашелся клиент по номеру - подставили значение в реквизит и сделали видимым, если нет - видимое текстовое поле. И тоже прописать при открытии

Автор: ZUBR 20.11.19, 21:58

Возник еще один вопрос. При автоматической записи в Справочник.Контрагенты все клиенты заносятся в корневой каталог. Но там есть папка Покупатели. Как сделать, чтобы клиенты заносились туда?Я пробовал прописать СоздатьОбъект("Справочник.Контрагенты.Покупатели") , но это не работает.
Для меня сейчас это не критично, но не хочется потом переносить и сортировать по папкам.
Спасибо!

Автор: Макс1С 20.11.19, 22:44

ZUBR @ Сегодня, 21:58 * ,
Нужно заполнить реквизит "Родитель" у создаваемого элемента справочника. Реквизит с типом Контрагент, т.е. например так:

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

Автор: ZUBR 05.12.19, 0:53

Макс1С @ 20.11.19, 22:44 * ,
не получилось. Я не очень понял, куда тулить родителя. записывает в корень. Привожу часть кода, понимаю, что не правильный, совсем неправильный. Исправьте, пожалуйста. Для того, чтобы сделать, надо понимать. Мне не понятно. Спасибо.

Если Кл=0 Тогда
Мистер = СоздатьОбъект("Справочник.Контрагенты");       
Родитель=СоздатьОбъект("Справочник.Контрагенты");
Родитель.НайтиПоНаименованию("Покупатели");

Мистер.Новый();                        
Мистер.Наименование=Клиент;
Мистер.ПолнНаименование=Клиент;                  //ф.и.о из документа накладная
Мистер.Телефоны=Телефон;              //№ телефона из документа накладная
Мистер.ПочтовыйАдрес=Адрес;
Мистер.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо;
Мистер.ВалютаВзаиморасчетов = Константа.БазоваяВалюта;
Мистер.ВалютаКредита = Константа.БазоваяВалюта;
Мистер.ВалютаКредитаПоставщика = Константа.БазоваяВалюта;
          Если ПустаяСтрока(Телефон)=0 Тогда
Мистер.Записать();                   //записываем новую запись в справочник Контрагенты.  
Контрагент = Родитель.ТекущийЭлемент();
          КонецЕсли;
   КонецЕсли;

Автор: andrew76 05.12.19, 3:25

ZUBR @ Сегодня, 3:53 * ,

Доброе утро !

Если Кл=0 Тогда
Мистер = СоздатьОбъект("Справочник.Контрагенты");      
Мистер.НайтиПоНаименованию("Покупатели");
Род=Мистер.ТекущийЭлемент();

Мистер.Новый();                        
Мистер.Родитель=Род;  
Мистер.Наименование=Клиент;
Мистер.ПолнНаименование=Клиент;                  //ф.и.о из документа накладная
Мистер.Телефоны=Телефон;              //№ телефона из документа накладная
Мистер.ПочтовыйАдрес=Адрес;
Мистер.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо;
Мистер.ВалютаВзаиморасчетов = Константа.БазоваяВалюта;
Мистер.ВалютаКредита = Константа.БазоваяВалюта;
Мистер.ВалютаКредитаПоставщика = Константа.БазоваяВалюта;

Если ПустаяСтрока(Телефон)=0 Тогда
       Мистер.Записать();                   //записываем новую запись в справочник Контрагенты.  
КонецЕсли;
  
КонецЕсли;

Автор: andrew76 05.12.19, 6:01

Мистер = СоздатьОбъект("Справочник.Контрагенты");       
Мистер.НайтиПоНаименованию("Покупатели");
Род=Мистер.ТекущийЭлемент();   //получаем ссылку на запись Группы

Мистер.Новый();                        
Мистер.Родитель=Род;  //при записи в справочник сопоставляем со ссылкой на Группу


Не понял , что за условие выполняется для переменной Кл ?

Автор: ZUBR 05.12.19, 19:53

andrew76 @ Сегодня, 6:01 * ,
andrew76 @ Сегодня, 6:01 * ,
у меня в модуле формы введена переменная Кл. При введении в акт приема телефона клиента осуществляется поиск его по справочнику Контрагенты. Если такой телефон уже есть, тогда в документ автоматически подставляется клиент из справочника и переменной Кл присваивается 1. Если же такого телефона в справочнике нет, тогда переменной Кл присваивается 0 и при проведении документа в справочник заносятся данные нового клиента из документа АктПриема. После чего Кл присваивается 1. Переменная введена для того, чтобы не записывать в справочник одинаковых клиентов каждый раз при проведении документа.

Автор: andrew76 06.12.19, 8:40

ZUBR @ Вчера, 22:53 * ,

Понятно.Проблема с группой Покупатели решена ?

Автор: ZUBR 08.12.19, 14:52

andrew76 @ 06.12.19, 8:40 * ,
нет еще, руки не дошли. Отпишусь обязательно.

Автор: ZUBR 08.12.19, 17:32

ZUBR @ Сегодня, 14:52 * ,
все сделал. Все работает. Правда, мне не совсем понятно. Но работает))
Спасибо за помощь.

Автор: andrew76 08.12.19, 19:13

ZUBR @ Сегодня, 20:32 * ,

Мистер = СоздатьОбъект("Справочник.Контрагенты");       
Мистер.НайтиПоНаименованию("Покупатели");  //ищем группу справочника "Покупатели"
Род=Мистер.ТекущийЭлемент();                       // в переменную Род записываем  ссылку на запись группы "Покупатели"

Мистер.Новый();                        
Мистер.Родитель=Род;  //при записи в справочник нового контрагента указываем ссылку на Группу "Покупатели"
                                  //Свойство элемента справочника Родитель это и есть Группа - в нашем случае "Покупатели"

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua