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

Февраль 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();	

Май 9, 2014

1C шаблоны

Filed under: — admin @ 4:35 дп

Powered by WordPress

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