Как открыть форму выбора с определенным отбором в 1С 8.3 ?

Часто требуется дополнить условия выбора объекта на форме. Для этого существует обработчик события «НачалоВыбора». В примере приведен случай когда при выборе договора нужен отбор по реквизиту Контрагент, заданного на форме. Для элемента управления «Договор» формируем обработчик события «ДоговорНачалоВыбора», в котором пишем следующий код:

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

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

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

Сравнение строковых массивов

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

 Пример:

Источник 1 Источник 2
Реализация товаров и услуг №10 от 07.12.2016 Реализация товаров и услуг №5 от 01.12.2016
Реализация товаров и услуг №12 от 05.12.2016 Реализация товаров и услуг №20 от 10.12.2016
Реализация товаров и услуг №5 от 01.12.2016

Предположим, в левой колонке  проверенные реализации, в которых мы точно уверены, в правой — реализации, которые выводит некий отчет, созданный новым программистом. По замыслу — отчет должен выводить реализации только из перечня в левой колонке (возможно не все), когда надо проверить какие реализации НЕ вошли в перечень левой колонки, возникает проблема — нет средств проверки, даже Excel не поможет, только визуально.

 Для решения проблемы создана обработка, сравнивающая массивы строк. На рисунке показано первоначальное заполнение левой и правой части, как в таблице выше:

 sm1

После нажатия кнопки в правой части остаются те строки, которых нет в левой части:

sm2

 Скачать обработку (1C v8.3) >>

Программно открыть любой файл в операционной системе из 1С

Для того, что бы открыть для просмотра любой файл на диске, например файл Excel, необходимо выполнить одну команду на клиенте:

ЗапуститьПриложение(ИмяФайла);

Имя файла в данном случае полное, например C:\Documents\File.xlsx

Получение имени типа ссылочного значения

Определение имени типа ссылочного значения нужно в случаях выгрузки данных например в XML файл что бы описать формат хранимых данных. К примеру, имя типа для документа «Реализация товаров и услуг» будет выглядеть так: «Документ.РеализацияТоваровУслуг».

Имя типа ссылочного значения «Ссылка» определяется следующим выражением:

ИмяТипа = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();

Получение ссылки по идентификатору 1С 8.х

При загрузке ссылочных данных из текстовых файлов иногда необходимо получать саму ссылку по имеющемуся строковому идентификатору этой ссылки:

// идентификатор ссылки хранится в переменной Строка_ИД
// получение уникального идентификатора
УИД = новый УникальныйИдентификатор(Строка_ИД);
// непосредственно получение ссылки
Контрагент = Справочники.Контрагенты.ПолучитьСсылку(УИД);

Получить идентификатор ссылки 1С 8.х

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

// тип получаемого значения — уникальный идентификатор
Идентификатор НекотораяСсылка.Ссылка.УникальныйИдентификатор();
// идентификатор можно преобразовать в строку
ИдентификаторТекстом = Строка(Идентификатор);

 

Сохранение таблицы в файл Doc, Excel, PDF, HTML и Txt на клиенте с открытием

Как правило выгружать данные в Excel требуется в табличной форме. В примере на клиенте (на форме) имеется таблица с колонками «Номер», «Наименование» и «Сумма». Выгрузка в Excel проходит только на клиенте для экономии времени и когда на сервере не установлен Excel. Выполняется в два этапа:
1. Заполнение табличного документа
2. Сохранение табличного документа в нужном формате
3. Открытие файла нужной программой

Код выгрузки

allformats

Скачать текст программы >>

Как установить параметр СКД программно (управляемые формы)

&НаСервере
Процедура УстановитьПараметрСКД()
   ПараметрСКД = Отчет.КомпоновщикНастроек.
Настройки.ПараметрыДанных.

  Элементы.Найти(«ИмяПараметра»)
  ПараметрСКД.Использование = Истина;
  ПараметрСКД.Значение = Значение;
КонецПроцедуры

Чтение файлов Excel при помощи ADO

При больших файлах Excel чтение каждой ячейки через COM объект Excel.Application приводит к большим затратам времени, для ускорения процесса чтения можно воспользоваться объектом ADODB. Обработка происходит на клиенте, поэтому файл Excel читается в массив строк, где строка представлена как массив.

&НаКлиенте
Функция ПолучитьМассивXLSФайла(ИмяФайлаЗагрузки)

Connection = Новый COMОбъект(«ADODB.Connection»);
// Можно использовать строку подключения для Excel ранее 2007
//СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source = » + ИмяФайлаЗагрузки;
СтрокаПодключения = «Provider=Microsoft.ACE.OLEDB.12.0; Data Source = « + ИмяФайлаЗагрузки;
СтрокаПодключения = СтрокаПодключения+«; Extended Properties = «+«»»Excel 8.0″+»;HDR=NO;IMEX=1″»;»;

Попытка
   Connection.Open(СтрокаПодключения);
Исключение
   Сообщить(ОписаниеОшибки());
   Возврат Неопределено;
КонецПопытки;

Command = Новый COMОбъект(«ADODB.Command»);
axCatalog = Новый COMОбъект(«ADOX.Catalog»);
axCatalog.ActiveConnection = Connection;
// получить имя первого листа
Для каждого Лист ИЗ axCatalog.Tables Цикл
      ИмяТаблицы = Лист.Name;
      Прервать;
КонецЦикла;

RecordSet = Новый COMОбъект(«ADODB.RecordSet»);
Command.ActiveConnection = Connection;
Command.CommandText =«SELECT COUNT(*) FROM [«+ИмяТаблицы+«]»;
Command.CommandType =1;
RecordSet = Command.Execute();
КоличествоСтрок = RecordSet.Fields(0).Value;
Command.CommandText = «SELECT * FROM [«+ИмяТаблицы+«]»;
Command.CommandType = 1;
Попытка
      RecordSet = Command.Execute();
Исключение
      Сообщить(ОписаниеОшибки());
КонецПопытки;

RecordSet.MoveNext();
ФайлВФормеМассива = новый Массив;

Пока RecordSet.EOF() = 0 Цикл
   МассивСтроки = новый Массив;
   для НомерПоля = 1 по RecordSet.Fields.Count цикл
      МассивСтроки.Добавить(RecordSet.Fields(НомерПоля1).Value);
   КонецЦикла;
   ФайлВФормеМассива.Добавить(МассивСтроки);
   RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Connection.Close();

Возврат ФайлВФормеМассива;

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

Если названия листов на русском языке, то после имени листа надо ставить знак «$».

Как получить макет отчета в управляемой форме

Функция ПолучитьМакетНаСервере()

ОбъектОтчета = РеквизитФормыВЗначение(«Отчет»);
Макет = ОбъектОтчета.ПолучитьМакет(«Макет»);
Возврат Макет;

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