Загрузка прайс-листа из EXCEL в справочник Номенклатура, с картинками и иерархией, без установленного MS Office на компьютере

10.08.19

Учетные задачи - Розничная торговля

Загрузка прайс листа из EXCEL или табличного документа 1С MXL с сохранением структуры иерархии. А так же с картинками. При этом нет необходимости устанавливать Mcrosoft Office на компьютер. Загрузка в УТ 11.4

Скачать исходный код

Наименование Файл Версия Размер
ЗагрузитьПрайсЛистЭксельНеИспользуяЭксель
.zip 75,85Kb
36
.zip 75,85Kb 36 Скачать

Дисклеймер:

Данная статья является больше описанием моего собственного опыта решения данного вопроса, но не в кой мере каким-то универсальным решением для всех и каждого. Поэтому заранее прошу прощения за некоторые упущения и тонкости, которые я мог упустить в процессе её написания.

Предисловие:

Захотелось как-то помочь всем тем несчастным вроде меня, кто знает, что можно читать EXCEL и уже не раз загружал что-то из него в 1С. Но вот тут возникла потребность загрузить картинки из ячеек, да так, что бы понимать какой строке таблицы соответствует какая картинка, что очень даже важно, если загружаешь прайс-лист поставщика.

Покопавшись немного в интернете появилось понимание, что EXCEL 2010 никак не предоставляет возможности выдернуть из себя картинку. И многие используют сторонние библиотеки, для переноса картинки из буфера обмена в файл. Источник //infostart.ru/public/16800/ К Сожалению у меня это не заработало. Библиотека регистрируется нормально но не работает, по причине не ясной до сих пор.

Тогда было принято решение поступить радикально и работать не с объектом EXCEL, а непосредственно с табличным документом, так как есть методы позволяющие прочитать файл xlsx и загрузить его в табличный документ и работать уже конкретно с ним. К счастью у табличного документа 1С у рисунка есть метод позволяющий сохранить его в файл, что уже огромный плюс.

Но тут уже встала другая проблема. Как понять какая картинка, какой строке соответствует? Наивно пологая, что через ширину столбцов и строк можно получить координаты картинки, я «наступил на огромные грабли». Вообще мне не понятно почему так происходит? Почему координаты ячейки не соответствуют координатам картинки. Почему нет какого-то соответствия или индекса или ещё чего-то в 1С, что бы можно было это сопоставить. Это был тупик, пока я не наткнулся на маленькую статейку с кодом вот тут:
https://medium.com/1c-tricks/-c146cf0af7d1                
Спасибо автору Дмитрий Марочко, теперь хоть и через костыли, но всё же я мог найти координаты картинки для нужной строки.

Дальше были только мелочные проблемы, например в Экселе есть возможность получить уровень группировки с помощью Лист1.rows(Х).OutlineLevel А вот в табличном документе такого свойства нет. Ещё возникали проблемы при загрузке картинки уже непосредственно в 1С, но это лишь от незнания особенностей конфигурации УТ 11.4

Платформа: 1С:Предприятие 8.3 (8.3.13.1690)
Конфигурация:  Управление торговлей, редакция 11 (11.4.6.207)

Хватит рассусоливать, погнали код.

Я выложу основные моменты в виде текста, что бы любой мог ими воспользоваться. Но для особо ленивых будет доступна обработка, в которой уже всё готово.  А так же пример прайс-листа. 

  1. Самое простое – это прочитать Эксель в табличный документ. Тут ничего сложно. Единственное есть нюанс, что чтение происходит на сервере и файл у вас должен быть доступен со стороны сервера. У меня это условие выполнялось, так что тут я особо не заморачивался.
    EXCEL открывается в табличном документе, при этом даже не обязательно, что бы на компьютере был установлен какой-то из продуктов Microsoft Office.

    Объект.ТабДок.Прочитать(Объект.ПутьКФайлу);


    В данном случае Объект.ТабДок – это реквизит на форме типа ТабличныйДокумент. Таким образом, у нас файл EXCEL открывается в табличном документе, при этом даже не обязательно, что бы на компьютере был установлен какой-то из продуктов Microsoft Office.

    Следующий код выполняется на клиенте

  2. Следующим этапом надо определить, где находятся нужные нам колонки. Что бы ни подгонять каждый раз таблицу под какой-то определённый шаблон, чего конечные пользователи делать не будут, я написал алгоритм, который позволяет автоматически определять, в каких колонках какие данные находятся.
    При этом, список данных, которые нужны заранее задан как колонки таблицы значений на форме. В моём случае это: Артикул Аналоги, Бренд, Номенклатура, Применяемость, Цена. Алгоритм анализирует начало таблицы в поисках имён и сам определяет по наименованию в какой колонке какие данные лежат. При этом у меня был довольно таки сложный прайс лист, так как в нём присутствовали повторяющиеся названия в колонках, например слово «номенклатура» встречалось несколько раз. Поэтому было дополнительное условие, выбирающее название колонки с наименьшей длинной.

     

    //Создадим структуру, которая будет хранить номер строки и номер колонки табличного документа в которых расположены соответсвующие данные
    	КолПрайсЛист = Новый Структура;
    	Для каждого Эл из Элементы.ТабЛист.ПодчиненныеЭлементы Цикл
    		КолИмя = НРЕГ(СтрЗаменить(Эл.Имя,"ТабЛист",""));
    		КолПрайсЛист.Вставить(КолИмя+"Строка",0);
    		КолПрайсЛист.Вставить(КолИмя+"Колонка",0);
    		КолПрайсЛист.Вставить(КолИмя+"Длинна",99);//Так как названия колонок могут повторятся, нам нужно выбрать название с минимальной длинной
    	КонецЦикла;
    	
    	Для Х=1 По КоличествоКолонок Цикл  //что бы не по всей таблице ведь мы ищем только шапку а она где-то вверху
    		Для У=1 По КоличествоКолонок Цикл
    			
    			ТекстХУ = НРЕГ(Объект.ТабДок.Область(Х,У,Х,У).Текст);
    			
    			Если СтрНайти(ТекстХУ,"бренд")<>0 тогда
    				КолПрайсЛист.брендСтрока = Х;
    				КолПрайсЛист.брендКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"номенклатура")<>0 тогда //как раз таки слово "Номенклатура" у нас встречается несколько раз
    				Если СтрДлина(ТекстХУ)<=КолПрайсЛист.номенклатураДлинна Тогда
    				  	КолПрайсЛист.номенклатураСтрока = Х;
    					КолПрайсЛист.номенклатураКолонка = У;
    					КолПрайсЛист.номенклатураДлинна =  СтрДлина(ТекстХУ);
    				КонецЕсли;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"артикул")<>0 тогда
    				КолПрайсЛист.артикулСтрока = Х;
    				КолПрайсЛист.артикулКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"аналог")<>0 тогда
    				КолПрайсЛист.аналогиСтрока = Х;
    				КолПрайсЛист.аналогиКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"применяемость")<>0 тогда
    				КолПрайсЛист.применяемостьСтрока = Х;
    				КолПрайсЛист.применяемостьКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"цена")<>0 тогда  //Так же как и цена, так же может быть не одна
    				Если СтрДлина(ТекстХУ)<=КолПрайсЛист.ценаДлинна Тогда
    					КолПрайсЛист.ценаСтрока = Х;
    					КолПрайсЛист.ценаКолонка = У;
    					КолПрайсЛист.ценаДлинна =  СтрДлина(ТекстХУ);
    				КонецЕсли;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"картинка")<>0 тогда
    				КолПрайсЛист.картинкаСтрока = Х;
    				КолПрайсЛист.картинкаКолонка = У;
    			КонецЕсли;
    			
    		КонецЦикла;
    	КонецЦикла;
    
  3. Таким образом мы находим всю шапку табличного документа и здесь же понимаем с какой строки начинать загрузку непосредственно данных. Конкретно в моём случае данные начинались через две строки после шапки, так как и сама шапка высотой в две ячейки.
     

    максимальныйX = 1;
    Для каждого Эл из КолПрайсЛист Цикл
    	Если СтрНайти(Эл.Ключ,"Строка")<>0 Тогда
    		Если максимальныйX<Эл.Значение Тогда
    			максимальныйX = Эл.Значение;
    		КонецЕсли;
    	КонецЕсли;
    КонецЦикла;
    Сообщить("Обход начинается с "+Строка(максимальныйX)+"+2");
    
  4. Дальше происходит непосредственно обход табличного документа по строкам с изъятием данных из колонок, которые мы нашли и добавлением в таблицу значений. Всё это происходит на клиенте.
     

    максимальныйX = максимальныйX + 2;
    	ТабЛист.Очистить();
    	ВремФ = КаталогВременныхФайлов()+"tempIMG.";
    	УровеньГруппировки = 0;
    	
    	//обход по таблице с данными до конца прайс листа. 
    	//Предполагается что у прайс листа нет никаких подвалов, 
    	//тем не менее этот момент тоже предусмотрен и если подвал всё же есть, 
    	//то в таблицу значений не будут добавлены пустые строки
    	Для Х=максимальныйX По КоличествоСтрок Цикл 
    		Если ПустаяСтрока(Объект.ТабДок.Область(Х,КолПрайсЛист.номенклатураКолонка,Х,КолПрайсЛист.номенклатураКолонка).текст) Тогда //Если колонка с номенклатурой пуста, то это скорее всего начало группы. А значит добавляем наименование группы
    			Если НЕ ПустаяСтрока(Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка,Х,КолПрайсЛист.брендКолонка).текст) Тогда //Если нет названия группы, то и не будем ничего создавать
    				Нов = ТабЛист.Добавить();
    				Нов.группа = Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка,Х,КолПрайсЛист.брендКолонка).текст;
    				//вот тут интересно. У Экселя есть Лист1.rows(Х).OutlineLevel 
    				//а у табличного документа такого нет, но есть "Отступ (Indent)" который может, хоть и косвенно, но указывать на иерархию, если выгрузка прайс листа идёт из 1С 
    				УровеньГруппировки = Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка,Х,КолПрайсЛист.брендКолонка).Отступ/2;//каждый уровень иерархии прибавляет по 2 символа отступа 
    				Нов.УровеньГруппировки = УровеньГруппировки;
    			КонецЕсли;
    		Иначе
    			Нов = ТабЛист.Добавить();
    			Нов.Бренд = Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка).текст;
    			Нов.Номенклатура = Объект.ТабДок.Область(Х,КолПрайсЛист.номенклатураКолонка).текст;
    			Нов.Артикул = Объект.ТабДок.Область(Х,КолПрайсЛист.артикулКолонка).текст;
    			Нов.Аналоги = Объект.ТабДок.Область(Х,КолПрайсЛист.аналогиКолонка).текст;
    			Нов.Применяемость = Объект.ТабДок.Область(Х,КолПрайсЛист.применяемостьКолонка).текст;
    			Попытка
    				Нов.Цена = Объект.ТабДок.Область(Х,КолПрайсЛист.ценаКолонка).text;
    			Исключение
    				Сообщить("Не число в "+Строка(Х)+" "+ОписаниеОшибки());
    			КонецПопытки;
    			Нов.УровеньГруппировки = УровеньГруппировки+1; //уровень группировки элемента на уровень больше группы
    			//Создадим временную картинку. 
    			ВремКартинка = Объект.ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
    			ВремКартинка.Имя = "Линейка"+Формат(Х,"ЧН=; ЧГ=");
    			//расположим её в следующей колонке после самой последней, в строке, в которой сейчас находимся
    			ВремКартинка.Расположить(Объект.ТабДок.Область(Х,КоличествоКолонок+1,Х,КоличествоКолонок+1));
    			//Таким образом мы получаем точный отступ сверху для картинки, которая содержит рисунок нашей номенклатуры
    			ТочноеПоложениеКартинки = ВремКартинка.Верх;
    			//Временная картинка больше не нужна
    			Объект.ТабДок.Рисунки.Удалить(ВремКартинка); 			
    			
    			//Обходим коллекцию рисунков и сравниваем отступ сверху с тем, который мы запомнили для данной строки
    			Для каждого Изо ИЗ Объект.ТабДок.Рисунки Цикл
    				Если ИЗО.Верх = ТочноеПоложениеКартинки Тогда  
    					ФК = Изо.Картинка.Формат();
    					Нов.Расширение = Строка(ФК);
    					Изо.Картинка.Записать(ВремФ+Нов.Расширение);  //Когда нашли, сохраняем картинку в файл
    					Нов.Картинка = Новый Картинка(ВремФ+Нов.Расширение); //после этого из файла добавляем её в нашу таблицу значений
    					Прервать;//Для экономии времени, если картинка нашлась, не нужно дальше обходить оставшиеся элементы коллекции
    				КонецЕсли;
    			КонецЦикла;
    			
    		КонецЕсли;
    	КонецЦикла;
    

     

  5. После всего этого весь прайс лист у нас в таблице значений на клиенте. И дальше мы можем обойти таблицу значений и создать как группы справочника, так и элементы с нужными значениями. Заострять на этом внимания я не буду. Тут многое зависит от конфигурации. Лишь покажу, как извлечь картинку из таблицы значений и поместить её в справочник номенклатура. Хоть данный код и справедлив только для УТ 11.4.6.207 но я думаю многим он будет полезен. (Потому что раньше это было просто. Добавляешь объект в ХранилищеДополнительнойИнформации и всё. А вот тут оказалось всё по другому)


     

    Если Не ПустаяСтрока(РасширениеКартинки) Тогда //Это колонка Стр.расширение,, если она не пустая, значит есть картинка в колонке Стр.Картинка
    				Найд = Справочники.НоменклатураПрисоединенныеФайлы.НайтиПоРеквизиту("ВладелецФайла",НовНом.Ссылка);
    				Если ЗначениеЗаполнено(Найд) Тогда  //Если вообще какой-то файл или картинка был загружен ранее, то он удаляется. 
    					Найд.ПолучитьОбъект().Удалить();
    				КонецЕсли;
    				//Помещаем двоичные данные картинки во временное хранилище
    				АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(КартинкаСтроки.ПолучитьДвоичныеДанные(), УникальныйИдентификатор);
    				//Создаём структуру
    				ПараметрыФайлаКартинки = Новый Структура();
    				ПараметрыФайлаКартинки.Вставить("Автор", Пользователи.АвторизованныйПользователь());
    				ПараметрыФайлаКартинки.Вставить("ВладелецФайлов", НовНом.Ссылка);
    				ПараметрыФайлаКартинки.Вставить("ИмяБезРасширения", НовНом.Наименование);
    				ПараметрыФайлаКартинки.Вставить("РасширениеБезТочки", "PNG");
    				ПараметрыФайлаКартинки.Вставить("ВремяИзмененияУниверсальное", ТекущаяДата());
    				//И используем один из механизмов, доступных в УТ 11.4.6.207 
    				ПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(
    					ПараметрыФайлаКартинки,
    					АдресФайлаВХранилище,
    					"",
    					"НоменклатураПрисоединенныеФайлы");
    				//Который возвращает нам ссылку на Справочники.НоменклатураПрисоединенныеФайлы
    				НовНом.ФайлКартинки = ПрисоединенныйФайл;
    				//Это значение присваивается реквизиту справочника номенклатура с именем "ФайлКартинки"
    			КонецЕсли;
    

     

  6. По большей части всё. Дальше просто создаёте номенклатуру, затем номенклатуру поставщика, создаёте между ними связь. А затем регистрируете цены поставщика.

Надеюсь, мой пример сэкономит кому-то время и нервы. Я собирал всю информацию около недели, так как нет всего этого в одном месте. Где-то одно, где-то другое. Много всего перепробовал, много не получилось, много ошибок допустил и исправил.R03;R03;R03;R03;R03;R03;R03;

обработка Управление Торговлей Прайс лист загрузка excel табличный документ картинки иерархия

См. также

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Система управления запасами для 1С помогает работать с запасами правильно: автоматически рассчитывает потребность и делает заказ поставщику, загружает прайсы, перемещает товары по филиалам, анализирует продажи и позволяет управлять ассортиментом.

28500 руб.

21.04.2017    90907    108    40    

197

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА (Разрешит. режим) + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

6000 руб.

27.02.2017    766254    4694    9501    

2792

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    166411    702    362    

389

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    211089    630    526    

446

54-ФЗ и Разрешительный режим. Обработки для подключения онлайн-касс к 1С 8 (поддержка Маркировки) + Эмулятор + ФФД 1.2

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима.

5400 руб.

25.05.2015    317901    1851    3012    

998

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

104000 руб.

18.03.2019    110648    34    114    

178
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. fullstack1c 35 06.12.19 09:29 Сейчас в теме
Не совсем универсальный механизм заполнения ТабЛист, по которому в дальнейшем создается номенклатура. Сильно привязано к текущему прайс листу.
+
2. user1887458 21.12.22 17:59 Сейчас в теме
Здравствуйте, подскажите пожалуйста, правильно ли я сделал?

&НаКлиенте
Процедура ПутьКФотографииНачалоВыбораНаСервере()
	ДД = новый ДвоичныеДанные(ПутьККартинке);
	ЗанестиФотографииНаСервер(ДД); 
	ОбновитьФотографию();
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФотографииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Диалог = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = "Рисунок png | *.png| Рисунок jpg |*.jpg";
	Если Диалог.Выбрать() Тогда
		ПутьККартинке = Диалог.ПолноеИмяФайла;
	КонецЕсли;
	ПутьКФотографииНачалоВыбораНаСервере();
КонецПроцедуры

Процедура ЗанестиФотографииНаСервер(ДД)
	Об = РеквизитФормыВЗначение("Объект"); 
	Хранилище = новый ХранилищеЗначения(ДД);
	Об.Картинка = Хранилище;    
	Об.Записать();
	ЗначениеВРеквизитФормы(Об,"Объект");
	КартинкаЕсть = Истина;
КонецПроцедуры

Процедура ОбновитьФотографию()
	Картинка = ПоместитьВоВременноеХранилище(Объект.Ссылка.Картинка.Получить(),УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОбновитьФотографию();
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)  
	// Вставить содержимое обработчика.
КонецПроцедуры


&НаКлиенте                                                                                    
Процедура ПриЗакрытии(ЗавершениеРаботы)                                                       
	Если Не Объект.КартинкаЕсть Тогда
		ПриЗакрытииНаСервере();
	КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	Если КартинкаЕсть Тогда
		Объект.КартинкаЕсть = Истина;
	КонецЕсли;
КонецПроцедуры            
Процедура ПередЗаписьюНаСервере()
КонецПроцедуры
Показать
+
3. пользователь 18.04.23 17:47
Сообщение было скрыто модератором.
...
4. user1887458 19.04.23 09:08 Сейчас в теме
Здравствуйте, подскажите пожалуйста, правильно ли я сделал?


Общая Форма:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
сообщить(имяпользователя()); #ВЫВОДПРИВЕТСТВЕННОГООКНА
КонецПроцедуры

&Наклиенте
Процедура открыть1(Команда)

СсылкаНаЭлементСправочника = полимя();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы); #ССЫЛКА НА ЮЗЕРА
КонецПроцедуры

&Насервере
функция полимя()
возврат справочники.сотрудники.НайтиПоРеквизиту("Логин",имяпользователя()); #ОТКРЫТИЕ СПРАВОЧНИКА
КонецФункции

Справочник «Пользователи»:
&НаКлиенте
Процедура картинкаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = ""; #ВЫБОР КАРТИНКИ
Фильтр = "Файл Jpg (*.jpg)|*.jpg|Рисунок PNG(*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда #КАРТИНКА
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Картинка = Адрес;
Модифицированность = Истина;
КонецПроцедуры

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

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

Функция Запись()
НовыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(имяпользователя());
Если НовыйПользователь = Неопределено Тогда
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
НовыйПользователь.Имя = Объект.Логин;
НовыйПользователь.ПолноеИмя = Объект.Наименование;
НовыйПользователь.АутентификацияСтандартная = Истина;
Если Объект.роль=Перечисления.роль.Админ тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Админ); #ДОБАВЛЕНИЕ ЮЗЕРА ПРОГРАММНО
иначеесли Объект.роль=Перечисления.роль.Повар тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Повар);
иначе Объект.роль= Перечисления.роль.Пользователь ;
НовыйПользователь.Роли.Добавить(метаданные.Роли.Поль);
Конецесли;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
НовыйПользователь.Записать();
КонецФункции


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ГСЧ = Новый ГенераторСлучайныхЧисел();
число=1;
п=0;
пока п<>3 цикл
а = ГСЧ.СлучайноеЧисло(1, 10);
б = ГСЧ.СлучайноеЧисло(1, 10);
Итог = а+б;

ВвестиЧисло(Число, ""+а+"+"+б+"=?",2);
если число=итог тогда
сообщить("ждлвтпаол");
прервать;
КонецЕсли;
п=п+1;
КонецЦикла;
если п=3 тогда
Режим = РежимДиалогаВопрос.ОК; #КАПЧА
Вопрос(("ты лох" ), Режим, 0);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
если не пустаястрока(объект.код) тогда
элементы.Роль.Доступность=ложь;
КонецЕсли;
КонецПроцедуры
+
5. user1887458 19.04.23 12:59 Сейчас в теме
Здравствуйте, подскажите пожалуйста, правильно ли я сделал?


Общая Форма:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
сообщить(имяпользователя()); #ВЫВОД ПРИВЕТСТВЕННОГО ОКНА
КонецПроцедуры

&Наклиенте
Процедура открыть1(Команда)

СсылкаНаЭлементСправочника = полимя();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы); #ССЫЛКА НА ЮЗЕРА
КонецПроцедуры

&Насервере
функция полимя()
возврат справочники.сотрудники.НайтиПоРеквизиту("Логин",имяпользователя()); #ОТКРЫТИЕ СПРАВОЧНИКА
КонецФункции

Справочник «Пользователи»:
&НаКлиенте
Процедура картинкаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = ""; #ВЫБОР КАРТИНКИ
Фильтр = "Файл Jpg (*.jpg)|*.jpg|Рисунок PNG(*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда #КАРТИНКА
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Картинка = Адрес;
Модифицированность = Истина;
КонецПроцедуры

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

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

Функция Запись()
НовыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(имяпользователя());
Если НовыйПользователь = Неопределено Тогда
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
НовыйПользователь.Имя = Объект.Логин;
НовыйПользователь.ПолноеИмя = Объект.Наименование;
НовыйПользователь.АутентификацияСтандартная = Истина;
Если Объект.роль=Перечисления.роль.Админ тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Админ); #ДОБАВЛЕНИЕ ЮЗЕРА ПРОГРАММНО
иначеесли Объект.роль=Перечисления.роль.Повар тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Повар);
иначе Объект.роль= Перечисления.роль.Пользователь ;
НовыйПользователь.Роли.Добавить(метаданные.Роли.Поль);
Конецесли;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
НовыйПользователь.Записать();
КонецФункции


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ГСЧ = Новый ГенераторСлучайныхЧисел();
число=1;
п=0;
пока п<>3 цикл
а = ГСЧ.СлучайноеЧисло(1, 10);
б = ГСЧ.СлучайноеЧисло(1, 10);
Итог = а+б;

ВвестиЧисло(Число, ""+а+"+"+б+"=?",2);
если число=итог тогда
сообщить("ждлвтпаол");
прервать;
КонецЕсли;
п=п+1;
КонецЦикла;
если п=3 тогда
Режим = РежимДиалогаВопрос.ОК; #КАПЧА
Вопрос(("Попытки были исчерпаны!" ), Режим, 0);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
если не пустаястрока(объект.код) тогда
элементы.Роль.Доступность=ложь;
КонецЕсли;
КонецПроцедуры
+
6. electrolis 12 20.04.23 07:05 Сейчас в теме
(5)
Общая Форма:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
сообщить(имяпользователя()); #ВЫВОД ПРИВЕТСТВЕННОГО ОКНА
КонецПроцедуры

&Наклиенте
Процедура открыть1(Команда)

СсылкаНаЭлементСправочника = полимя();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы); #ССЫЛКА НА ЮЗЕРА
КонецПроцедуры

&Насервере
функция полимя()
возврат справочники.сотрудники.НайтиПоРеквизиту("Логин",имяпользователя()); #ОТКРЫТИЕ СПРАВОЧНИКА
КонецФункции

Справочник «Пользователи»:
&НаКлиенте
Процедура картинкаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = ""; #ВЫБОР КАРТИНКИ
Фильтр = "Файл Jpg (*.jpg)|*.jpg|Рисунок PNG(*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда #КАРТИНКА
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Картинка = Адрес;
Модифицированность = Истина;
КонецПроцедуры

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

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

Функция Запись()
НовыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(имяпользователя());
Если НовыйПользователь = Неопределено Тогда
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
НовыйПользователь.Имя = Объект.Логин;
НовыйПользователь.ПолноеИмя = Объект.Наименование;
НовыйПользователь.АутентификацияСтандартная = Истина;
Если Объект.роль=Перечисления.роль.Админ тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Админ); #ДОБАВЛЕНИЕ ЮЗЕРА ПРОГРАММНО
иначеесли Объект.роль=Перечисления.роль.Повар тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Повар);
иначе Объект.роль= Перечисления.роль.Пользователь ;
НовыйПользователь.Роли.Добавить(метаданные.Роли.Поль);
Конецесли;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
НовыйПользователь.Записать();
КонецФункции


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ГСЧ = Новый ГенераторСлучайныхЧисел();
число=1;
п=0;
пока п<>3 цикл
а = ГСЧ.СлучайноеЧисло(1, 10);
б = ГСЧ.СлучайноеЧисло(1, 10);
Итог = а+б;

ВвестиЧисло(Число, ""+а+"+"+б+"=?",2);
если число=итог тогда
сообщить("ждлвтпаол");
прервать;
КонецЕсли;
п=п+1;
КонецЦикла;
если п=3 тогда
Режим = РежимДиалогаВопрос.ОК; #КАПЧА
Вопрос(("Попытки были исчерпаны!" ), Режим, 0);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
если не пустаястрока(объект.код) тогда
элементы.Роль.Доступность=ложь;
КонецЕсли;
КонецПроцедуры
Показать


Конечно. а что, не работает?
+
Оставьте свое сообщение