Архив метки: 1с

Поиск документа 1С по номеру документа

В некоторых видах документов, которые имеют периодическую нумерацию, например РеализацияТоваровИУслуг, при поиске документа по номеру, нужно указывать дату (период), к которому этот документ относится. Мелочь, а 15 минут потратил, на то чтоб понять почему не возвращает без этого параметра ссылку на документ 😉

	док= Документы.РеализацияТоваров.НайтиПоНомеру("ИП00-008198",ТекущаяДата());
	сообщить(док);

Работа с MySQL из 1С в среде Windows

Для работы необходимо предварительно установить среду Visual studio 2015 redistributable и ODBC драйвер Mysql

Далее работаем из 1С с драйвером на прямую:

1) Установка соединения:

ИмяODBC = "noc.уцкаука.ru";
ИмяБазы = "ыаукаыук";
ИмяПользователя = "укаыука";
Пароль = "ыукаыука";

Connection = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};DATABASE=" + ИмяБазы + ";PWD=" + Пароль + ";PORT=3306;SERVER=" + ИмяODBC + ";UID=" + ИмяПользователя + ";";
Connection.Open(СокрЛП(СтрокаПодключения));

Выборка:

Запрос="select * from users";
Table = Connection.Execute(Запрос); 
Пока Table.EOF() = 0 Цикл 
	Сообщить(Table.Fields("login").Value); 
	Table.MoveNext();
КонецЦикла;
Table.Close();

Выполнение запроса:

		Запрос="insert into checks_1c (id,docnum,dt,goods,cost,seller,inn,kassa,type_pay,type_sell,result,cnt,summ) values (null,'"+Документ.Номер+"',now(),'"+ном+"',"+цена+",'"+продавец+"','"+инн+"',"+касса+","+ТипОплаты+","+ВидЧека+",9,"+количество+","+сумма+")";
		//Сообщить(Запрос);
		РезультатЗапроса = Connection.Execute(Запрос);

Обзор Атол 90Ф. Работа с 1С

Довелось давеча устанавливать и настраивать онлайн кассу Атол 90Ф, проданную одному  предпринимателю Ростелекомом. 

Описание кассы и функциональные возможности, вполне можно нагуглить, потому начнем сразу с описания боли.

Боль первая: касса оказалась с прошивкой от Февраля 2017 (на момент написания статьи — 1 Августа 2018). Как следствие — зарегистрировать кассу при помощи последних версий драйверов не удается — ругаются на «нет необходимых реквизитов». Пришлось ставить древние драйвера версии 8.14, и регистрировать кассу при помощи их.

Боль вторая: как оказалось, работа онлайн кассы для работы со внешним ПО заблокирована заводским кодом защиты №1. В свое время Атол сначала планировал разрешить работу с ПО, затем передумал по маркетинговым соображениям, затем снова передумал (когда Атол 90Ф сняли с производства) и стал раздавать кода защиты всем желающим, затем снова передумал и стал раздавать коды защиты только через некоторые сервисные центры. Обращение за кодом защиты в Ростелеком ничего не дало — мурыжили и тянули время три дня, в итоге сказали «не умеем, не можем». Пришлось обратиться в сторонний сервисный центр АРТОЛ35 и попросить чтоб дали ключ там. Цена вопроса — 500р. В итоге работа со сторонним ПО (читай с 1С) разблокирована.  Для Розницы 2.2 можно ставить или драйвер АТОЛ «С передачей данных», там в списке драйверов АТОЛ90Ф присутствует, или ветку 9х, там нужно выставлять АТОЛ 11Ф.

Боль третья: собственно из-за этой боли возникла как раз боль номер 2. А именно, с клавиатуры самой кассы чеки конечно выбивать можно… Но только со шпаргалкой. Ибо запомнить все последовательности нажатий кнопок для выбивания чека, закрытия — открытия смены, отмены чека и т.п. просто не реально. Интерфейс работы с кассой разрабатывался не для людей. Не знаю для кого. 

Еще один вариант выгрузки остатков товаров из 1С Розница 2.2 в файл XML.

Данную обработку можно использовать как основу для выгрузки списка товаров в интернет магазин. У меня и выгрузка из 1С и загрузка на сайт самописные, потому всё просто и понятно получается.  Обработку можно скачать тут


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


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

&НаКлиенте
Процедура КатегорииТовараОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	 СтандартнаяОбработка = Ложь;
     ИтоговаяТаблицаОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры


 &НаСервере
  Процедура ЗаполнитьПриСтартеНаСервере()
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("1127       "));
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("00-00001342"));
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("1161       "));
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("1434       "));
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("1078       "));
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("00-00001392"));
	нстр=объект.КатегорииТовара.Добавить(Справочники.Номенклатура.НайтиПоКоду("00-00001239"));
	объект.Склад=Справочники.Склады.НайтиПоНаименованию("Вологда Торговля");
	объект.ФайлВыгрузки="c:\temp\export.xml";
  КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	// заполняем при старте
	ЗаполнитьПриСтартеНаСервере();
КонецПроцедуры

&НаСервере
Функция СведенияПоНоменклатуре(ЗаписьXML,Номенклатура);
 		Запрос = Новый Запрос;
 		Запрос.Текст = 			
		"ВЫБРАТЬ
		|	НоменклатураДополнительныеРеквизиты.Значение КАК Значение,
		|	НоменклатураДополнительныеРеквизиты.Ссылка.Ссылка КАК Ссылка,
		|	НоменклатураДополнительныеРеквизиты.Свойство.Наименование КАК СвойствоНаименование,
		|	НоменклатураДополнительныеРеквизиты.Свойство.Заголовок КАК СвойствоЗаголовок
		|ИЗ
		|	Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
		|ГДЕ
		|	НоменклатураДополнительныеРеквизиты.Ссылка = &Ссылка";		
		Запрос.УстановитьПараметр("Ссылка", Номенклатура);
		Результат = Запрос.Выполнить().Выбрать();
		пока  Результат.Следующий() цикл
			ЗаписьXML.ЗаписатьНачалоЭлемента("meaning");
			 ЗаписьXML.ЗаписатьБезОбработки("<name>"+Результат.СвойствоЗаголовок+"</name>"+Символы.ПС);			
			 ЗаписьXML.ЗаписатьБезОбработки("<value>"+Результат.Значение+"</value>"+Символы.ПС);			
			ЗаписьXML.ЗаписатьКонецЭлемента();							
		конеццикла;

	КонецФункции	
	
	
&НаСервере
Функция СведенияПоЦенамНоменклатуры(ЗаписьXML,Номенклатура);
 		Запрос = Новый Запрос;
 		Запрос.Текст = 			
		"ВЫБРАТЬ
		|	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
		|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
		|ИЗ
		|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
		|ГДЕ
		|	ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура";		
		Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
		Результат = Запрос.Выполнить().Выбрать();
		пока  Результат.Следующий() цикл
			ЗаписьXML.ЗаписатьНачалоЭлемента("price");
			 ЗаписьXML.ЗаписатьБезОбработки("<type>"+Результат.ВидЦены+"</type>"+Символы.ПС);			
			 ЗаписьXML.ЗаписатьБезОбработки("<cost>"+Формат(Результат.Цена,"ЧГ=")+"</cost>"+Символы.ПС);			
			ЗаписьXML.ЗаписатьКонецЭлемента();							
		конеццикла;

КонецФункции	

&НаСервере
Функция СведенияПоКомплектующим(ЗаписьXML,Номенклатура);
 		Запрос = Новый Запрос;
 		Запрос.Текст = 			
		"ВЫБРАТЬ
		|	КомплектующиеНоменклатуры.Комплектующая.Наименование КАК КомплектующаяНаименование,
		|	КомплектующиеНоменклатуры.Комплектующая.Код КАК КомплектующаяКод
		|ИЗ
		|	РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
		|ГДЕ
		|	КомплектующиеНоменклатуры.Номенклатура = &Номенклатура";		
		Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
		Результат = Запрос.Выполнить().Выбрать();
		пока  Результат.Следующий() цикл
			ЗаписьXML.ЗаписатьНачалоЭлемента("order");
			 ЗаписьXML.ЗаписатьБезОбработки("<name>"+Результат.КомплектующаяНаименование+"</name>"+Символы.ПС);			
			 ЗаписьXML.ЗаписатьБезОбработки("<code>"+Результат.КомплектующаяКод+"</code>"+Символы.ПС);			
			ЗаписьXML.ЗаписатьКонецЭлемента();							
		конеццикла;

КонецФункции	

&НаСервере
Функция Фотографии(ЗаписьXML,Номенклатура);
	
 Запрос = Новый Запрос;
Запрос.Текст =      
"ВЫБРАТЬ
|   НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка,
|   НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
|   НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла,
|   НоменклатураПрисоединенныеФайлы.Том КАК Том,
|   НоменклатураПрисоединенныеФайлы.ФайлХранилище КАК ФайлХранилище
|ИЗ
|   Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
|ГДЕ
|   НоменклатураПрисоединенныеФайлы.ВладелецФайла.Ссылка = &ном"    ;
         
     Запрос.УстановитьПараметр("ном", Номенклатура);                 
     файлы=Запрос.Выполнить().Выбрать();            
     n=0;
     Пока файлы.Следующий() Цикл        
		 ЗаписьXML.ЗаписатьБезОбработки("<name>"+файлы.ПутьКФайлу+"</name>"+Символы.ПС);						 			
     конеццикла;     	
КонецФункции	

	
&НаСервере
	
Функция ЗаменитьСпецСимволы(_стр)
	стр=СтрЗаменить(_стр, "&", "&amp;");
	стр=СтрЗаменить(стр, """", "&quot;"); 
	стр=СтрЗаменить(стр, "<", "&lt;");
	стр=СтрЗаменить(стр, ">", "&gt;");
	стр=СтрЗаменить(стр, "‘", "'");
Возврат стр;

КонецФункции	
&НаСервере
Функция СоздатьXMLНаСервере()
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(объект.ФайлВыгрузки,"UTF-8");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
		ЗаписьXML.ЗаписатьНачалоЭлемента("export");	
		
		для каждого ГруппаНоменклатуры из объект.КатегорииТовара цикл
 		Запрос = Новый Запрос;
 		Запрос.Текст = 		
			"ВЫБРАТЬ
			|	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
			|	ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот,
			|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
			|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Родитель.Ссылка КАК НоменклатураРодитель,
			|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ПометкаУдаления КАК НоменклатураПометкаУдаления,
			|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Описание КАК НоменклатураОписание,
			|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Марка.Наименование КАК НоменклатураМаркаНаименование
			|ИЗ
			|	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
			|ГДЕ
			|	ТоварыНаСкладахОстаткиИОбороты.Склад = &Склад
			|	И ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
			|	И ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот > 0
			|	И ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЭтоГруппа = ЛОЖЬ";
			Запрос.УстановитьПараметр("Склад", объект.Склад);
			Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию(ГруппаНоменклатуры));
			Результат = Запрос.Выполнить().Выбрать();  
			
			пока  Результат.Следующий() цикл
				
					ЗаписьXML.ЗаписатьНачалоЭлемента("goods");
					ЗаписьXML.ЗаписатьБезОбработки("<good_cat>"+ГруппаНоменклатуры+"</good_cat>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<good_name>"+Результат.Номенклатура.Наименование+"</good_name>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<good_code>"+Результат.Номенклатура.Код+"</good_code>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<good_art>"+Результат.Номенклатура.Артикул+"</good_art>"+Символы.ПС);
					
					описание=ЗаменитьСпецСимволы(Результат.НоменклатураОписание);
				
					ЗаписьXML.ЗаписатьБезОбработки("<good_comment>"+описание+"</good_comment>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<is_delete>"+Результат.НоменклатураПометкаУдаления+"</is_delete>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<good_parent_name>"+Результат.НоменклатураРодитель.Наименование+"</good_parent_name>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<good_parent_code>"+Результат.НоменклатураРодитель.Код+"</good_parent_code>"+Символы.ПС);
					ЗаписьXML.ЗаписатьБезОбработки("<count>"+Результат.КоличествоКонечныйОстаток+"</count>"+Символы.ПС);
					
						ЗаписьXML.ЗаписатьНачалоЭлемента("prices");
							СведенияПоЦенамНоменклатуры(ЗаписьXML,Результат.Номенклатура);
						ЗаписьXML.ЗаписатьКонецЭлемента();							
					
						ЗаписьXML.ЗаписатьНачалоЭлемента("propety");
							СведенияПоНоменклатуре(ЗаписьXML,Результат.Номенклатура);
						ЗаписьXML.ЗаписатьКонецЭлемента();							
				
						ЗаписьXML.ЗаписатьНачалоЭлемента("soorders");
							СведенияПоКомплектующим(ЗаписьXML,Результат.Номенклатура);
						ЗаписьXML.ЗаписатьКонецЭлемента();							

						ЗаписьXML.ЗаписатьНачалоЭлемента("photos");
							Фотографии(ЗаписьXML,Результат.Номенклатура);
						ЗаписьXML.ЗаписатьКонецЭлемента();							
						
						
					ЗаписьXML.ЗаписатьКонецЭлемента();
			конеццикла;	

		конеццикла;
		
		ЗаписьXML.ЗаписатьКонецЭлемента();
	

	//возврат ЗаписьXML;
КонецФункции


&НаКлиенте
Процедура СоздатьXML(Команда)	
	СоздатьXMLНаСервере();
КонецПроцедуры

1C: Множественный выбор из справочника, включая группы на управляемой форме

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

Создаем реквизит с типом «Список значений»

Код модуля:

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


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

&НаКлиенте
Процедура КатегорииТовараОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	 СтандартнаяОбработка = Ложь;
     ИтоговаяТаблицаОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры

Результат: