Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Как создать новый элемент справочника из документа? 1с 7.7 конф 7.7.003 2 страниц V   1 2 >          
ZUBR Подменю пользователя
сообщение 03.11.19, 2:12
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

andrew76 Подменю пользователя
сообщение 03.11.19, 4:47
Сообщение #2

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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


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

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


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

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

Спасибо сказали: ZUBR,

Pepe Подменю пользователя
сообщение 03.11.19, 11:42
Сообщение #3

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1447
Из: Ужгород
Спасибо сказали: 762 раз
Рейтинг: 231

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

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 03.11.19, 12:52
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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


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

andrew76 Подменю пользователя
сообщение 03.11.19, 13:45
Сообщение #5

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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


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


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

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


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


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

Спасибо сказали: ZUBR,

Pepe Подменю пользователя
сообщение 03.11.19, 15:10
Сообщение #6

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1447
Из: Ужгород
Спасибо сказали: 762 раз
Рейтинг: 231

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

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

Спасибо сказали: ZUBR,

andrew76 Подменю пользователя
сообщение 03.11.19, 16:21
Сообщение #7

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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

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

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 03.11.19, 17:11
Сообщение #8

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

ZUBR Подменю пользователя
сообщение 03.11.19, 21:36
Сообщение #9

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

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

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

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


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

andrew76 Подменю пользователя
сообщение 04.11.19, 2:52
Сообщение #10

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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

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

volodya1122 Подменю пользователя
сообщение 04.11.19, 9:47
Сообщение #11

Оратор
Иконка группы
Группа: Местный
Сообщений: 348
Из: Тернопіль
Спасибо сказали: 139 раз
Рейтинг: 141.7

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


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

Спасибо сказали: ZUBR,

Макс1С Подменю пользователя
сообщение 04.11.19, 10:14
Сообщение #12

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 0

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

ZUBR Подменю пользователя
сообщение 20.11.19, 21:58
Сообщение #13

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

Макс1С Подменю пользователя
сообщение 20.11.19, 22:44
Сообщение #14

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 0

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

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

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 05.12.19, 0:53
Сообщение #15

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

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

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

andrew76 Подменю пользователя
сообщение 05.12.19, 3:25
Сообщение #16

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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

Доброе утро !

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

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

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

Спасибо сказали: ZUBR,

andrew76 Подменю пользователя
сообщение 05.12.19, 6:01
Сообщение #17

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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

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


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

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 05.12.19, 19:53
Сообщение #18

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

andrew76 Подменю пользователя
сообщение 06.12.19, 8:40
Сообщение #19

Оратор
*****
Группа: Пользователи
Сообщений: 460
Из: Казахстан
Спасибо сказали: 45 раз
Рейтинг: 45

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

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

ZUBR Подменю пользователя
сообщение 08.12.19, 14:52
Сообщение #20

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 01.11.24, 0:45
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!