1C шаблоны и готовые решения

Ноябрь 22, 2017

Импорт файлов сотрудников из 1С ЗУП 2.5 КОРП в 1С ЗУП 3.1 КОРП.

Filed under: — admin @ 5:59 дп

В процессе миграции в ЗУП 3.1. КОРП, была поставлена задача по переносу прикрепленных файлов и фотографий из ЗУП 2.5. КОРП. Для этого разработаем обработку по перекачке файлов. Алгоритм такой: подключаемся через com соединение к базе ЗУП 2.5., отбираем данные по файлам физ. лиц и загружаем в справочник ЗУП 3.1. КОРП «ФизическиеЛицаПрисоединенныеФайлы». Далее код реализующий данный механизм:

// Функция УстановитьCOMСоединение устанавливает COM соединение с внешней базой
Функция УстановитьCOMСоединение()
		
	СтрокаПодключения = "Srvr=""serverName""; Ref=""BaseName""; Usr=""UserName""; Pwd=""Passowrd"";";
	
	Попытка
		Коннектор = Новый COMObject("V83.COMConnector");
		Соединение = Коннектор.Connect(СтрокаПодключения);
		Возврат Соединение;
	Исключение
		ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ВызватьИсключение ТекстСообщенияОбОшибке;
	КонецПопытки;
	
КонецФункции

// Функция ПолучитьТаблицуЗначенийФизЛица получает таблицу значений физ. лиц из ЗУП 3.1. КОРП
функция ПолучитьТаблицуЗначенийФизЛица()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	о.Ссылка КАК ФизическоеЛицо,
		|	о.Наименование КАК ФизическоеЛицоНаименование,
		|	о.Код КАК ФизическоеЛицоКод
		|ИЗ
		|	Справочник.ФизическиеЛица КАК о";		
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если Не РезультатЗапроса.Пустой() Тогда
		Возврат РезультатЗапроса.Выгрузить();
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

// Процедура ПеренестиФайлыВФизическиеЛицаПрисоединенныеФайлы добавляет файл физ. лица в  справочник 
// ЗУП3.1. КОРП ФизическиеЛицаПрисоединенныеФайлы
// Параметры:
//                 ДвоичныеДанные- данные файла
//                 ПараметрыФайла - структура с параметрами файла
Процедура ПеренестиФайлыВФизическиеЛицаПрисоединенныеФайлы(ДвоичныеДанные, ПараметрыФайла) 
	
	Если ДвоичныеДанные = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор());
		
	Попытка
		ПрисоединенныйФайлСсылка = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище,, ПараметрыФайла.Описание);
	Исключение
		ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
	КонецПопытки;

	УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
	
КонецПроцедуры

// Процедура КомандаВыполнитьНаСервере Выполняет алгоритм по переносу файлов сотрудников из ЗУП 2.5. 
//КОРП в ЗУП 3.1. КОРП
&НаСервере
Процедура КомандаВыполнитьНаСервере()
	
	Соединение = УстановитьCOMСоединение(); 
	
	ТЗФизЛица = ПолучитьТаблицуЗначенийФизЛица();
	МассивНаименованийФизЛиц = Соединение.NewObject("Массив");
	
	Если ТЗФизЛица <> Неопределено и ТЗФизЛица.Количество() > 0 Тогда
		
		Для каждого о из ТЗФизЛица Цикл
			МассивНаименованийФизЛиц.Добавить(о.ФизическоеЛицоНаименование);
		КонецЦикла;	
		
	Иначе
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нет данных по физ. лицам!");
		Возврат;
	КонецЕсли;	
	
	Запрос = Соединение.NewObject("Запрос");
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ХранилищеДополнительнойИнформации.ИмяФайла,
	|	ХранилищеДополнительнойИнформации.Объект.Наименование как ФизическоеЛицоНаименование,
	|	ХранилищеДополнительнойИнформации.Объект.Код как ФизическоеЛицоКод,
	|	ХранилищеДополнительнойИнформации.Хранилище
	|ИЗ
	|	Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации
	|	где ХранилищеДополнительнойИнформации.Объект Ссылка Справочник.ФизическиеЛица
	|	и ХранилищеДополнительнойИнформации.Объект.Наименование в (&МассивНаименованийФизЛиц) 
	| упорядочить по ХранилищеДополнительнойИнформации.Объект";
	Запрос.УстановитьПараметр("МассивНаименованийФизЛиц", МассивНаименованийФизЛиц);
	Результат = Запрос.Выполнить();
	о = Результат.Выбрать();
	
	Пока о.Следующий() Цикл
		
		Отбор = Новый Структура("ФизическоеЛицоНаименование, ФизическоеЛицоКод", о.ФизическоеЛицоНаименование, о.ФизическоеЛицоКод);
		НайденныеСтроки = ТЗФизЛица.НайтиСтроки(Отбор);
		
		Если НайденныеСтроки.Количество() > 0 Тогда
		
			ФизЛицоСсылка = НайденныеСтроки[0].ФизическоеЛицо;
			КаталогВременныхФайлов = КаталогВременныхФайлов();
			ПутьКФайлу = КаталогВременныхФайлов +  о.ИмяФайла;
			Данные = о.Хранилище.Получить();
			
			Попытка
				Данные.Записать(ПутьКФайлу);
			Исключение
				ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
				Прервать;
			КонецПопытки;
			
			Файл = Новый Файл(ПутьКФайлу);
			Если Файл.Существует() Тогда

				ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
				
				ПараметрыФайла = Новый Структура();
				ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
				ПараметрыФайла.Вставить("ВладелецФайлов", ФизЛицоСсылка);
				ПараметрыФайла.Вставить("ИмяБезРасширения", СтрЗаменить(Файл.Имя,Файл.Расширение,""));
				ПараметрыФайла.Вставить("РасширениеБезТочки", СтрЗаменить(Файл.Расширение,".",""));
				ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Файл.ПолучитьУниверсальноеВремяИзменения());
				ПараметрыФайла.Вставить("Описание",?(Найти(нрег(Файл.Расширение),"jpg") > 0, "фото",""));

				ПеренестиФайлыВФизическиеЛицаПрисоединенныеФайлы(ДвоичныеДанные, ПараметрыФайла);
				
				Сообщить("" + ПутьКФайлу + " => " + ФизЛицоСсылка);
				УдалитьФайлы(ПутьКФайлу);
			КонецЕсли;	
		Иначе
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Физ. лицо не найдено: '" + о.ФизЛицоНаименование + "' [" + о.ФизЛицоКод +"]");
		КонецЕсли;	
		
	КонецЦикла;	
	
КонецПроцедуры
// Процедура КомандаВыполнить запускает механизм по импорту файлов в обработке по переносу.
&НаКлиенте
Процедура КомандаВыполнить(Команда)	
	КомандаВыполнитьНаСервере();	
КонецПроцедуры

Результатом обработки будет заполненный справочник с файлами сотрудников и их фотокарточками.
Выглядеть это будет примерно вот так, как на картинках ниже.
Файлы сотрудника:
Guid1C
Карточка сотрудника:
Guid1C

Октябрь 20, 2017

Расширение функционала конфигурации ЗУП 3.1. без изменения типовой. Добавление фотографии в карточку сотрудника.

Filed under: — admin @ 6:30 пп

При миграции в ЗУП 3.1. КОРП оказалось, что отсутствует фотография сотрудника в форме элемента справочника Сотрудники. Но фотографии сотрудника были в ЗУП 2.5 КОРП. Чтобы не терять данные по сотрудникам при миграции, было решено создать аналогичный функционал в ЗУП 3.1.
Итак, для добавления фотографии сотрудника в карточку ЗУП 3.1. будем использовать механизм расширений.
Плюсы расширений очевидны: нет необходимости изменять типовую конфигурацию, возможно включать/отключать расширения по желанию заказчика, автоматическое обновление типовой конфигурации.
1. Создаем новое расширение конфигурации «Расширение_ДопФункционал», тип «Адаптация»
2. Добавляем общий модуль, назовем его «Расш_ДополнительныеПроцедурыИФункцииСервер», в свойствах установим галочку «Сервер».
В модуль добавляем процедуру:

// Процедура УстановитьФотоСотрудника добавляет фотографию сотрудника на форму элемента справочника Сотрудники
// Параметры:
//                 ФизическоеЛицоСсылка - Ссылка на Физическое лицо
//                 Фото - Реквизит формы элемента справочника Сотрудники
Процедура УстановитьФотоСотрудника(ФизическоеЛицоСсылка, Фото) Экспорт	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Файлы.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.ФизическиеЛицаПрисоединенныеФайлы КАК Файлы
		|ГДЕ
		|	Файлы.ВладелецФайла = &ВладелецФайлов
		|	И (ВЫРАЗИТЬ(Файлы.Описание КАК СТРОКА(4))) = ""фото""
		|	И НЕ Файлы.ПометкаУдаления";
	
	Запрос.УстановитьПараметр("ВладелецФайлов", ФизическоеЛицоСсылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	о = РезультатЗапроса.Выбрать();

	Пока о.Следующий() Цикл
		ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(о.Ссылка);
		Фото = ПоместитьВоВременноеХранилище(ДанныеФайла);
	КонецЦикла;		

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

3. Добавляем в расширение форму элемента справочника «Сотрудники»
Guid1C
4. В модуле формы добавляем следующий код:

&НаСервере
Процедура ПриЧтенииНаСервереПосле(ТекущийОбъект)
	Расш_ДополнительныеПроцедурыИФункцииСервер.УстановитьФотоСотрудника(ФизическоеЛицоСсылка, Фото);
КонецПроцедуры

5. В саму форму добавляем поле «ПолеФото» и реквизит формы «Фото» как на картинке:
Guid1C

5. Сохраняем конфигурацию и запускаем 1С ЗУП 3.1. В карточке сотрудника добавляем фото через ссылку на справочник «Присоединенные файлы».
В карточке файла, в окне описание пишем ключевое слово «фото». По нему запрос из процедуры «УстановитьФотоСотрудника()» найдет фотографию сотрудника.

В результате фотография сотрудника теперь отображается в карточке:
Guid1C

Таким образом, с помощью расширений и использования типового механизма 1С ЗУП 3.1. по хранению присоединенных файлов, мы получили доп. функционал как в ЗУП 2.5. КОРП.

Октябрь 13, 2017

Шаблон внешней обработки для ЗУП 3.1 КОРП. Подключение внешней обработки в нетиповой документ конфигурации 1С ЗУП 3.1 КОРП.

Filed under: — admin @ 6:40 дп

Данный шаблон проверен на ЗУП 3.1. КОРП версия 3.1.3.253.
Создаем новую обработку. В модуле обработки добавляем ниже приведенные функции и процедуры:

// Функция СведенияОВнешнейОбработке создает и заполняет структуру с информацией о внешней обработке
// Возвращаемое значение:
//                 Структура, возвращаются ПараметрыРегистрации.
Функция СведенияОВнешнейОбработке() Экспорт
	
	Назначения = Новый Массив;
	//тип объектов для регистрации обработки
	Назначения.Добавить("Документ.ВашДокумент");
	
	ПараметрыРегистрации = Новый Структура;
	//Вид - Строковое представление из Перечисление.ВидыДополнительныхОтчетовИОбработок
	//ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов, ШаблонСообщения
	ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");
	//Назначение - типы объектов метаданных (справочники/документы)
	ПараметрыРегистрации.Вставить("Назначение",Назначения);
	//Наименование обработки для заполнения поля в справочнике ДополнительныеОтчетыИОбработки
	ПараметрыРегистрации.Вставить("Наименование","Дополнительные обработки по заполнению документа");
	//Версия обработки
	ПараметрыРегистрации.Вставить("Версия","1.0");
	//Информация для заполнения поля в справочнике ДополнительныеОтчетыИОбработки
	ПараметрыРегистрации.Вставить("Информация","Дополнительные обработки по заполнению документа");
	//БезопасныйРежим для заполнения поля в справочнике ДополнительныеОтчетыИОбработки
	//В безопасном режиме:
	//игнорируется привилегированный режим;
	//запрещены внешние по отношению к платформе 1С:Предприятия действия: 
	//COM; загрузка внешних компонентов; 
	//запуск внешних приложений и команд операционной системы; 
	//доступ к файловой системе, кроме временных файлов; доступ к Интернету.
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
	
	Команды = СформироватьТаблицуКоманд();
	ДобавитьКоманду(Команды, 
	"Заполнить табличнную часть 'Операции'",
	"ЗаполнитьТабличннуюЧастьОперации",
	"ВызовКлиентскогоМетода", 
	Ложь, );
	
	ДобавитьКоманду(Команды, 
	"Заполнить табличнную часть 'Исполнители'",
	"ЗаполнитьТабличннуюЧастьИсполнители",
	"ВызовКлиентскогоМетода", 
	Ложь, );
	
	ПараметрыРегистрации.Вставить("Команды",Команды);
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

// Функция СформироватьТаблицуКоманд создает и возвращает таблицу команд внешней обоработки
// Возвращаемое значение:
//                 ТаблицаЗначений, возвращаются ТаблицаКоманд.
Функция СформироватьТаблицуКоманд()
	ТаблицаКоманд = Новый ТаблицаЗначений;
	//Представление - строковое описание обработки для пользователя в элементе справочника ДополнительныеОтчетыИОбработки 
	ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
	//Идентификатор - строковый идентификатор команды
	ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
	//Строковое представление из Перечисление.СпособыВызоваДополнительныхОбработок
	//ВызовКлиентскогоМетода, ВызовСерверногоМетода, ЗаполнениеФормы, ОткрытиеФормы, СценарийВБезопасномРежиме, ЗагрузкаДанныхИзФайла
	ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
	//Выводит оповещение перед запуском команды.
	ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
	//Для печатных форм "ПечатьMXL"
	ТаблицаКоманд.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
	Возврат ТаблицаКоманд;
КонецФункции	

// Процедура ДобавитьКоманду добавляет строку в таблицу значений ТаблицаКоманд
// Параметры:
//                 ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ""
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление;
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры	

Далее добавляем новую форму с командой ‘ВыполнитьКоманду’ и добавляем в модуль формы следующий код:

// Процедура ВыполнитьКоманду выполняет команды внешней обработки на клиенте 
// с использованием вызова 'ВызовКлиентскогоМетода'
// Параметры:
//			ИдентификаторКоманды - строковый идентификатор команды
//			ОбъектыНазначенияМассив - массив ссылок на объекты(документы/справочники), к которым назначена внешняя обработка
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	
	Сообщить("Идет выполнение команды... " + ИдентификаторКоманды);
	
	Если ИдентификаторКоманды = "ЗаполнитьТабличннуюЧастьОперации" Тогда
		//Код по заполнению табличной части операции через ВладелецФормы.Объект.Операции 
		//или ПараметрыВызоваСервера.ОбъектыНазначения[0].Операции
	ИначеЕсли ИдентификаторКоманды = "ЗаполнитьТабличннуюЧастьИсполнители" Тогда
		//Код по заполнению табличной части исполнители через ВладелецФормы.Объект.Исполнители 
		//или ПараметрыВызоваСервера.ОбъектыНазначения[0].Исполнители
	КонецЕсли;		
			
КонецПроцедуры

После регистрации обработки в справочнике ‘ДополнительныеОтчетыИОбработки’
получаем следующий вид на форме документа:
Guid1C

Чтобы подключить заполнение из внешних обработок в нетиповой документ, необходимо сделать следующие модификации кода:
В модуле нетипового документа добавить следующие строки:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// Обработчик подсистемы "Дополнительные отчеты и обработки".
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

Далее в конфигурации, в определяемом типе ‘ОбъектСДополнительнымиКомандами’ необходимо включить в состав наш нетиповой документ.

Февраль 15, 2017

Функция для конвертации _IDRRef в глобальный уникальный идентификатор GUID объекта 1С

Filed under: — admin @ 7:56 пп

—Функция для конвертации _IDRRef в глобальный уникальный идентификатор GUID объекта 1С
—Работает на MS SQL Server 2008
USE DataBaseName
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID (N‘dbo.Convert_IDRRefToGUID’, N‘FN’) IS NOT NULL
DROP FUNCTION dbo.Convert_IDRRefToGUID;
GO

CREATE FUNCTION dbo.Convert_IDRRefToGUID(@_IDRRef binary(16))
RETURNS VARCHAR(36)
AS
BEGIN
RETURN
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),25,8) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),21,4) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),17,4) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),1,4) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),5,12);
END;

GO

—Пример работы функции:

SELECT TOP 5 T1._IDRRef, dbo.Convert_IDRRefToGUID(T1._IDRRef) AS _GUID FROM _Document33 AS T1 WITH(NOLOCK)
GO

—Результат выполнения:

Guid1C

 

Июнь 3, 2016

Sql скрипт восстановления базы из последней созданной резервной копии.

Filed under: — admin @ 8:06 дп

—Скрипт восстанавливает базу из каталога «E:\Backup\». Причем для восстановления берется последний по дате создания файл резервной копии.
—Далее скрипт, при необходимости, добавляется в план обслуживания с необходимым расписанием работы.

USE Master
GO
DECLARE @backup_filename varchar(100);

DECLARE @files table (ID int IDENTITY, FileName varchar(100))
insert into @files execute xp_cmdshell ‘dir E:\Backup\ /b’
set @backup_filename = ‘E:\Backup\’ + (select top 1 FileName from @files where FileName is not null order by ID desc )
RESTORE DATABASE [DataBase]
FROM DISK = @backup_filename WITH FILE = 1,
MOVE N’DataBaseName’ TO N’E:\1CData\MSSQL\DATA\DataBase.mdf’,
MOVE N’DataBaseName_log’ TO N’E:\1CData\MSSQL\DATA\DataBase_log.ldf’,
NOUNLOAD, REPLACE, STATS = 10
GO

Май 26, 2016

Получение таблицы начислений по сотрудникам за период в 1С ЗУП 2.5 (Корп и Проф), используя механизм конфигурации. Решение производственной проблемы по виду расчета «Оплата по производственным нарядам».

Filed under: — admin @ 8:21 пп

             Разрабатывая механизм заполнения сдельного наряда в 1С ЗУП 2.5, я столкнулся с проблемой неверного
отражения сумм по виду расчета «Оплата по производственным нарядам» в документе «начисление зарплаты» и получения сообщения «Оплата по производственным нарядам: Данные об фактической выработке введены сводно. Расчет суммы по данному виду расчета невозможен». Проблема заключалась в том, что сдельные наряды были сформированы «Сводно, в целом за период». Решением было формировать отработанное время сотрудника заполняя «табель сдельного наряда». Но сотрудников «сдельщиков» достаточно много, по ним были сформированы многочисленные кадровые перемещения в течении месяца со «сдельной оплаты» на «чтс» и «оклад». Соответственно вручную заполнить табель сдельного наряда было практически невозможно. Решением проблемы было создание обработки по автоматическому заполнению табеля сдельного наряда с учетом всех кадровых отклонений сотрудников. Но как получить периоды работы сотрудника на сделке? Для этого не нужно изобретать велосипед. Необходимо взять механизм используемый в документе «начисление зарплаты». Функция представленная ниже получает на вход массив сотрудников и период начисления. На выходы мы получаем таблицу по сотрудникам со всеми видами расчета по периодам. Далее мы можем отобрать начисления по виду расчета «Оплата по производственным нарядам» и корректно заполнить «табель сдельного наряда». В результате была создана обработка по заполнению табличной части сдельного наряда, которая существенно сократила время по формированию сдельных нарядов сотрудниками отдела заработной платы и избавила расчетчика от ручной корректировки сумм по сдельной оплате в документе «начисления зарплаты».

функция ПолучитьТаблицуНачисленийСотрудниковОрганизации(МассивСотрудников, Период)

       Док = Документы.НачислениеЗарплатыРаботникамОрганизаций.СоздатьДокумент();

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

       Док.ПериодНачисленияДатаНачала = НачалоМесяца(Период);
       Док.ПериодНачисленияДатаОкончания = КонецМесяца(Период);
       Док.ПериодНачисления = Перечисления.ПериодНачисленияЗарплаты.УказанныйПериод;

       Запрос = Неопределено;
       Док.ВыполнитьАвтозаполнение(НачалоМесяца(Период), КонецМесяца(Период), Запрос, Ложь, Неопределено, МассивСотрудников);

       ТЗНачисления = Док.Начисления.Выгрузить(,"Сотрудник,ПодразделениеОрганизации,ВидРасчета,ДатаНачала,ДатаОкончания");
       Возврат ТЗНачисления;

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

Cокращение размера журнала транзакций MS SQL базы 1С

Filed under: — admin @ 7:51 пп

—Скрипт для сокращения размера журнала транзакций базы данных MS SQL
—Работает на MS SQL Server 2008
USE DataBaseName
ALTER DATABASE DataBaseName
SET RECOVERY SIMPLE
GO

—Логическое имя журнала <DataBaseName_log>транзакций базы данных

и желаемый размер в <2> мегабайтах файла журнала транзакций

DBCC SHRINKFILE(DataBaseName_log, 2)
GO
ALTER DATABASE DataBaseName
SET RECOVERY FULL
GO

Май 12, 2016

Работа с zip архивом

Filed under: — admin @ 9:51 дп
// Возвращает массив xml файлов извлеченных из zip архива
//
// Параметры:
//  ДвоичныеДанные - zip архив в виде двоичных данных
Функция РаспаковатьАрхивИПолучитьМассивИзвлеченныхФайлов(ДвоичныеДанные)
	
	ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip");
	АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор()); 
	Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
	Данные.Записать(ИмяФайлаАрхива);
	
	// открытие и распаковка архива
    Архив = Новый ЧтениеZipФайла(ИмяФайлаАрхива);
	МассивИзвлеченныхФайлов = Новый Массив();
	ВременныйКаталог = КаталогВременныхФайлов();
	
	Для каждого Элемент из Архив.Элементы Цикл
    	Архив.Извлечь(Элемент, ВременныйКаталог,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
		ПолныйПутьКИзвлеченномуФайлу = ВременныйКаталог + Элемент.Имя;
		//Проверяем существует ли файл
		Если НайтиФайлы(ПолныйПутьКИзвлеченномуФайлу).Количество() > 0 Тогда
			МассивИзвлеченныхФайлов.Добавить(ПолныйПутьКИзвлеченномуФайлу);
		КонецЕсли;		
	КонецЦикла;
	
	УдалитьФайлы(ИмяФайлаАрхива);
	
	Возврат МассивИзвлеченныхФайлов;
	
КонецФункции

Сформировать СКД отчет на сервере

Filed under: — admin @ 9:45 дп

Метод формирует СКД отчет в переданный табличный документ из внешней таблицы значений.

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

Май 29, 2015

Работа с механизмами: СохранитьЗначение и ВосстановитьЗначение в 1С

Filed under: — admin @ 5:44 дп

Нередко пользователю требуется сохранять значения выбранных полей в форме отчета или обработки, для повторного использования. Один из способов использование типовых механизмов 1С для «толстого клиента» (описание из справки 1С):

СохранитьЗначение(<Имя>, <Значение>) // Сохраняет значение для использования в текущем и последующих сеансах работы с программой.
ВосстановитьЗначение(<Имя>) // Получает значение, сохраненное ранее с помощью метода СохранитьЗначение

Одна из реализаций данного механизма на форме:
Добавляем в события ПриЗакрытии() и ПриОткрытии() формы следующий код:

Процедура ПриЗакрытии()
	//Сохранение поля типа дата 
	СохранитьЗначение("НачалоПериода",  НачалоПериода);	
	СохранитьЗначение("ОкончаниеПериода",  ОкончаниеПериода);	
	//Сохранение ссылочного поля 
	СохранитьЗначение("Контрагент",  Контрагент);	
	//Сохранение табличной части
	СохранитьЗначение("ТабличнаяЧасть", ТабличнаяЧасть.Выгрузить());	

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

Процедура ПриОткрытии()
	//Получаем значения сохраненных параметров
	мНачалоПериода = ВосстановитьЗначение("НачалоПериода");
	мОкончаниеПериода = ВосстановитьЗначение("ОкончаниеПериода");
	мКонтрагент = ВосстановитьЗначение("Контрагент");
	мТабличнаяЧасть = ВосстановитьЗначение("ТабличнаяЧасть");
	//Восстанавливаем значения через вспомогательную процедуру с проверкой типа 
	//и возвращаемого значения
	УстановитьЗначение(мНачалоПериода, НачалоПериода);
	УстановитьЗначение(мОкончаниеПериода, ОкончаниеПериода);
	УстановитьЗначение(мКонтрагент, Контрагент);
	УстановитьЗначение(мТабличнаяЧасть, ТабличнаяЧасть);
КонецПроцедуры

Процедура УстановитьЗначение(СохраненноеЗначение, Значение)
	
	Если СохраненноеЗначение <> Неопределено Тогда
		Если Типзнч(СохраненноеЗначение) = Тип("ТаблицаЗначений") Тогда
			Значение.Загрузить(СохраненноеЗначение);
		Иначе	
			Значение = СохраненноеЗначение;
		КонецЕсли;	
	КонецЕсли;
	
КонецПроцедуры

Работа с индикатором в 1С 8.2

Filed under: — admin @ 5:19 дп
Процедура ОбработкаТабличнойЧасти(ТабличнаяЧасть)

	Индикатор = ЭлементыФормы.Индикатор1;
	Индикатор.Значение = 0;
	Индикатор.МаксимальноеЗначение = ТабличнаяЧасть.Количество();

	Для каждого строкаТабличнойЧасти из ТабличнаяЧасть Цикл
		Индикатор.Значение = Индикатор.Значение + 1;
	КонецЦикла;	

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

Получить значение ячейки табличного документа 1С

Filed under: — admin @ 5:09 дп
ТабличныйДокумент = ПолучитьМакет("Макет");
ЗначениеЯчейки = ТабличныйДокумент.ПолучитьОбласть("R"+формат(номерСтроки,"ЧГ=")+"C"+формат(номерСтолбца,"ЧГ=")).ТекущаяОбласть.Текст;

Ноябрь 12, 2014

Отправить почту из 1С

Filed under: — admin @ 10:05 дп
Процедура ОтправитьEmail(АдрессПочты, ТемаСообщения, ТекстСообщения) Экспорт 
		
	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Профиль.АдресСервераSMTP     = "smtpserver.ru"; 	
	Профиль.ПортSMTP             = 25;
	Профиль.ПортPOP3             = 110;
	Профиль.Пользователь 	     = "user";
	Профиль.Пароль 		     = "password";
	Профиль.АутентификацияSMTP   = СпособSMTPАутентификации.ПоУмолчанию;
	Профиль.ПарольSMTP           = Профиль.Пароль;
	Профиль.ПользовательSMTP     = Профиль.Пользователь; 
	
	ИнтернетПочта = Новый ИнтернетПочта;
 
	Попытка
		ИнтернетПочта.Подключиться(Профиль);
	Исключение
		ЗаписьЖурналаРегистрации(ОписаниеОшибки());
 	КонецПопытки;
 
	Сообщение = Новый ИнтернетПочтовоеСообщение;
	Сообщение.Кодировка	  = "KOI8-R";
  	Сообщение.Отправитель     = "user@corp.com"; 
	Сообщение.Вложения.Добавить("D:\test.txt","документ");
	Сообщение.Получатели.Добавить(АдрессПочты);
	
	Сообщение.Тема = ТемаСообщения;

	Сообщение.Тексты.Добавить(ТекстСообщения);
	
	Попытка
		ИнтернетПочта.Послать(Сообщение);
	Исключение
		ЗаписьЖурналаРегистрации(ОписаниеОшибки());
	КонецПопытки;
	
	ИнтернетПочта.Отключиться();
 	
КонецПроцедуры

Программно открыть внешний отчет или обработку

Filed under: — admin @ 9:51 дп
Функция ОткрытьВнешнийОтчет(ИмяОтчета) Экспорт
 
	ПутьКВременномуФайлу=КаталогВременныхФайлов()+
"ВременныйФайл" + формат(ТекущаяДата(),"ДФ=ddMMyyyyhhmmss")+ ".tmp";
	о = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОтчета);
	
	Если о=Справочники.ВнешниеОбработки.ПустаяСсылка() Тогда
		Возврат неопределено;	
	КонецЕсли;
	
    Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОтчета).ХранилищеВнешнейОбработки.Получить().Записать(ПутьКВременномуФайлу);
	
	Если о.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет Тогда
    	ВнешниеОтчеты.ПолучитьФорму(ПутьКВременномуФайлу).Открыть();
	КонецЕсли;
	
	Если о.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка Тогда
		ВнешниеОбработки.ПолучитьФорму(ПутьКВременномуФайлу).Открыть();
	КонецЕсли;
	
    УдалитьФайлы(ПутьКВременномуФайлу);
	
	Возврат неопределено;	
	
конецфункции

Расшифровка в табличном документе

Filed under: — admin @ 9:39 дп
Процедура ОсновныеДействияФормыДействие(Кнопка)

  СтруктураРасшифровки = Новый Структура;
  СтруктураРасшифровки.Вставить("Контрагент",мКонтрагент);
  Область.Параметры.Контрагент = мКонтрагент;
  Область.Параметры.КонтрагентРасшифровка = СтруктураРасшифровки;
//
//
//
  Действие = Новый Действие("ПолеТабличногоДокумента1ОбработкаРасшифровки");
  ЭлементыФормы.ПолеТабличногоДокумента1.УстановитьДействие("ОбработкаРасшифровки", Действие);
  ЭлементыФормы.ПолеТабличногоДокумента1.ВставитьОбласть(ТабДокумент.Область());
//
КонецПроцедуры

Процедура ПолеТабличногоДокумента1ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
  //Обработка расшифровки
  СтандартнаяОбработка = Ложь;

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

Сентябрь 12, 2014

Заполнение дерева значений из запроса

Filed under: — admin @ 10:01 дп
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Ссылка
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|
|УПОРЯДОЧИТЬ ПО
|	Ссылка ИЕРАРХИЯ";

ДеревоЗначений = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Сентябрь 11, 2014

Последовательность дат

Filed under: — admin @ 4:07 дп
выбрать добавитькдате(&месяц,день,t.н)
из
(
выбрать 

	а * 1000 + б * 100 + с * 10 + д как н
                             
из

(выбрать 0 как а union выбрать 1 union выбрать 2 union выбрать 3 union выбрать 4 union выбрать 5 union выбрать 6 union выбрать 7 union выбрать 8 union выбрать 9) т1,
(выбрать 0 как б union выбрать 1 union выбрать 2 union выбрать 3 union выбрать 4 union выбрать 5 union выбрать 6 union выбрать 7 union выбрать 8 union выбрать 9 ) т2,
(выбрать 0 как с union выбрать 1 union выбрать 2 union выбрать 3 union выбрать 4 union выбрать 5 union выбрать 6 union выбрать 7 union выбрать 8 union выбрать 9 ) т3,
(выбрать 0 как д union выбрать 1 union выбрать 2 union выбрать 3 union выбрать 4 union выбрать 5 union выбрать 6 union выбрать 7 union выбрать 8 union выбрать 9 ) т4

) t
где  t.н < день(конецпериода(&месяц,месяц))

Сентябрь 3, 2014

Обработка события НачалоВыбора

Filed under: — admin @ 7:04 дп

Процедура НачалоВыбораКонтрагента(Элемент,СтандартнаяОбработка, Значение)

        СтандартнаяОбработка = Ложь;
        ФормаВыбора=Справочники.Контрагенты.ПолучитьФормуВыбора(,Элемент);
        ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;
        ФормаВыбора.Отбор.Сбросить();
        ФормаВыбора.Отбор.Ссылка.ВидСравнения=ВидСравнения.ВСписке;
        ФормаВыбора.Отбор.Ссылка.значение = ПолучитьСписокКонтрагентов(Значение);
        ФормаВыбора.Отбор.Ссылка.установить();
        ФормаВыбора.Открыть();

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


Открыть файл

Filed under: — admin @ 6:59 дп
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "(*.xls)|*.xlsx";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл...";

Если ДиалогОткрытияФайла.Выбрать() Тогда

       МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
       ВыбФайл = Новый Файл(МассивФайлов[0]);
       Если ВыбФайл.Существует() Тогда
              возврат ВыбФайл.ПолноеИмя;
       КонецЕсли;

Иначе
       Сообщить ("Не выбран файл!");
       возврат "";
КонецЕсли;

Работа с excel

Filed under: — admin @ 6:26 дп
Попытка
	Эксель = Новый COMОбъект("Excel.Application");
	Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
	Листов = Книга.Worksheets.Count;
	ИмяЛиста = Неопределено;

	для лст = 1 по Листов цикл

		Лист = Книга.WorkSheets(лст);
		ИмяЛиста = Лист.Name;
		ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

		для Строка = 1 по ВсегоСтрок цикл

			значениеЯчейки = Лист.Cells(Строка,1).Value;

		конеццикла;

	конеццикла;

Исключение

	Сообщить(ОписаниеОшибки());
	Эксель.Application.Quit();
	
КонецПопытки; 

Эксель.Application.Quit();	
Older Posts »

Powered by WordPress

Яндекс.Метрика