←Назад

#join
function join(Знач list, delimeter=",") export
	r = "";
	for each item in list do
		r = r + trimall(string(item)) + delimeter;
	enddo;
	if strlen(r) > 0 then
		r = left(r, strlen(r) - strlen(delimeter));
	endif;
	return r;
endfunction


#ReadExcel
Excel = Новый COMОбъект("Excel.Application");

Workbook = Excel.Workbooks.Open(ПутьКФайлу);

Данные = Новый ТаблицаЗначений;

СтрокаКолонок = 1; // строка с названиями колонок
ПерваяСтрока = 2; // первая строка с данными
ПерваяКолонка = 1; // и так понятно

CurPage = Workbook.Sheets(1);  // обрабатываем только первый лист

КоличествоСтрок = CurPage.Cells.SpecialCells(11).Row;
КоличествоКолонок = CurPage.Cells.SpecialCells(11).Column;

ДанныеФайла = CurPage.Range(CurPage.Cells(ПерваяСтрока, ПерваяКолонка), CurPage.Cells(КоличествоСтрок, КоличествоКолонок)).Value.Выгрузить();
Для Счетчик = 1 По КоличествоКолонок Цикл
	Попытка
		Данные.Колонки.Добавить(ОчиститьСтроку(CurPage.Cells(СтрокаКолонок, Счетчик).Text), Новый ОписаниеТипов("Строка"), CurPage.Cells(СтрокаКолонок, Счетчик).Text);
	Исключение
		Данные.Колонки.Добавить("Колонка"+Строка(Счетчик), Новый ОписаниеТипов("Строка"), "Колонка"+Строка(Счетчик));
		Сообщить("Какая-то ошибка в колонке: " + "Колонка" + Строка(Счетчик));
	КонецПопытки;
КонецЦикла;
Для Счетчик = 1 По КоличествоСтрок Цикл
	НоваяСтрока = Данные.Добавить();
КонецЦикла;
Для Счетчик = 0 По КоличествоКолонок - 1 Цикл
	Данные.ЗагрузитьКолонку(ДанныеФайла[Счетчик], Счетчик);
КонецЦикла;
Сообщить("Чтение файла завершено.");
Excel.Application.Quit();

--------------------------------------------------------------------------------

#ChooseFile
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Фильтр = "*.*";
Если ДиалогВыбора.Выбрать() Тогда
	ПутьКФайлу = ДиалогВыбора.ПолноеИмяФайла;
КонецЕсли;

--------------------------------------------------------------------------------

#ReadXML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM  = ПостроительDOM.Прочитать(ЧтениеXML);
Элементы = ДокументDOM.ПолучитьЭлементыПоИмени("");
Для Каждого Элемент из Элементы Цикл
    Сообщить(Элемент.ТекстовоеСодержимое);
КонецЦикла;

--------------------------------------------------------------------------------

#Prices
ВЫБРАТЬ
    Н.Наименование КАК Наименование,
    Цены.Цена КАК ЗакупочнаяЦена,
    Цены.ТипЦен КАК ТипЦен,
    Свойства.Свойство.Наименование КАК Свойство,
    Свойства.Значение КАК ЗначениеСвойства
ИЗ
    Справочник.Номенклатура КАК Н
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК Цены
        ПО Н.Ссылка = Цены.Номенклатура
        И (Цены.ТипЦен В (&ТипыЦен))
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК Свойства
        ПО Н.Ссылка = Свойства.Объект
        И (Свойства.Свойство В (&Свойства))
ГДЕ
    НЕ Н.ЭтоГруппа
    И НЕ Н.ПометкаУдаления
    И НЕ Н.Предопределенный
    И Цены.Цена > 0

--------------------------------------------------------------------------------

#ComSafeArray
Процедура СформироватьЭксельФайл(ТЗ)

    Excel = Новый COMОбъект("Excel.Application");
    Document = Excel.Workbooks.Add(); // Тут главное добавить новую книгу в эксель-документ

    ВсегоСтрок = ТЗ.Количество();
    ВсегоКолонок = ТЗ.Колонки.Количество();

    ComSafeArr = Новый COMSafeArray("VT_VARIANT", ВсегоКолонок, ВсегоСтрок);

    Для СчСтрок = 0 По ВсегоСтрок - 1 Цикл

        Строка = ТЗ[СчСтрок];

        Для СчКолонок = 0 По ВсегоКолонок - 1 Цикл

            ComSafeArr.SetValue(СчКолонок, СчСтрок, Лев(Строка[СчКолонок], 900)); // к сожалению строки надо обрезать

        КонецЦикла;

    КонецЦикла;

    Excel.Range(Excel.Cells(1, 1), Excel.Cells(ВсегоСтрок, ВсегоКолонок)).Value = ComSafeArr;

    Excel.Visible = 1; // Покажем получившееся

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

--------------------------------------------------------------------------------

#WSLink
/////////////////////////
// Инициализация по объекту конфигурации
ns = "namespace"; // нэймспейс
username = "XXX"; // логин, может не быть
password = "XXX"; // пароль, может не быть

WS = WSСсылки.ИмяWSСсылки.СоздатьWSПрокси(ns, "ИмяWSОперации", "ИмяWSОперации_SOAP12");

WS.Пользователь = username;
WS.Пароль = password;

// XDTO может не быть (пользуйтесь строками :-))
//pack = WS.ФабрикаXDTO.Пакеты.Получить(ns);

Ответ = WS.ОперацияВебСервиса(ВходнойПараметр1, ВходнойПараметр2, ..., ВходнойПараметрN);


/////////////////////////
// Инициализация по wsdl-ссылке

ns = "namespace"; // нэймспэйс
url = "http://YOUR_WSDL_LINK?wsdl";
username = "XXXXXX"; // логин, может не быть
password = "XXXXXX"; // пароль, может не быть

Определение = Новый WSОпределения(url, username, password);
WS = Новый WSПрокси(Определение, ns, "WebServiceName", "WebServiceNameSoap");

Ответ = WS.ОперацияВебСервиса(ВходнойПараметр1, ВходнойПараметр2, ..., ВходнойПараметрN);

--------------------------------------------------------------------------------

#HTTP_GET_query
// актуально для свежих версий 8.2 и выше
Сервер = "XXXXXX";
Порт = 80;

Соединение = Новый HTTPСоединение(Сервер, Порт);

Запрос = Новый HTTPЗапрос("/1c.php?name=hello");
HTTPОтвет = Соединение.Получить(Запрос);
ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();

Сообщить(ТекстОтвета);
--------------------------------------------------------------------------------

#OpenExternal
ИмяФайла = ПолучитьИмяВременногоФайла(".epf");
_ = Справочники.ВнешниеПечатныеФормы.НайтиПоКоду("00000010").Хранилище.Получить();
_.Записать(ИмяФайла);
ФормаОбработки = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
ФормаОбработки.Открыть();
--------------------------------------------------------------------------------

#ADOExcel
&НаСервере
Функция ОбработатьФайлНаСервере(ПутьКФайлу)
    first_row = 1;
    last_row = 0;

    conn_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ПутьКФайлу) + ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;""";
    ADODBConnection = New COMObject("ADODB.Connection");
    ADODBConnection.ConnectionString = conn_string;

    Try
        ADODBConnection.Open();
    Except
        Try
            conn_string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "  + СокрЛП(ПутьКФайлу) + ";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;""";
            ADODBConnection.ConnectionString = conn_string;
            ADODBConnection.Open();
        Except
            msg = "COM object is not available. Tried Microsoft.ACE.OLEDB.12.0, Microsoft.Jet.OLEDB.4.0";
            print(msg);
            return 1;
        Endtry
    Endtry;

    schema = ADODBConnection.OpenSchema(20); // 20 - enum for adSchemaTables
    While Schema.EOF() = 0 Do
        sheet_name = schema.Fields("table_name").Value;
        query = "SELECT * FROM [" + sheet_name + "]";

        ADODBRecordset = New COMObject("ADODB.Recordset");
        ADODBRecordset.Open(query, ADODBConnection);

        If (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Then
            line_count = 0;
            Сообщить(НСтр("ru = '" + sheet_name + ": не содержит данных.'"), СтатусСообщения.Внимание);

            // Завершение работы.
            // Закрытие Объектов.
            ADODBRecordset.Close();
            ADODBConnection.Close();
            ADODBRecordset   = Неопределено;
            ADODBConnection = Неопределено;
        Endif;

        // Импирически определенные параметры для правильного определения количества строк листа.
        //ADODBRecordset.AbsolutePage     = 1;
        //ADODBRecordset.AbsolutePosition = 1;

        // Параметр, возвращаемый в вызывающую процедуру.
        КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;    // (+1) - учет Строки-Заголовока, которая "съедается".
        КолвоКолонокExcel = ADODBRecordset.Fields.Count;

        ТаблицаРезультат = Новый ТаблицаЗначений;

        // Формирование колонок результирующей таблицы.
        // "НомерСтроки" - для наглядности и удобства.
        // В зависимости от разрабатываемой обработки.
        // "Сопоставлено" - может быть другим.
        // Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла EXCEL.
        ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
        ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);
        Для ит = 1 ПО КолвоКолонокExcel Цикл
            Поле = ADODBRecordset.Fields.Item(ит - 1);
            ИмяКолонки = "К_" + ит;
            Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", ".")));
            // Замена "#" на ".", т.к. при считывании ADODB "." в имени колонки заменяется на "#".
	    КонецЦикла;

        // ТаблицаРезультат: 1-я строка - Строка-Заголовок.

        // Добавление этой строки обусловлено исключительно из соображений идентичности содержимого файла EXCEL и ТаблицыЗначений,
        // выводимой на форме Обработки, и дальнейшей обработки строки заголовка
        // с целью сопоставления колонок EXCEL и реквизитов 1С: для Справочников, ПВХ, Регистров, Документов.

        // Если в Вашей обработке в результирующей таблице в качестве 1-ой строки не нужна Строка-Заголовок, то
        // следует закомментировать следующий цикл:
        НоваяСтрока = ТаблицаРезультат.Добавить();
        НоваяСтрока.НомерСтроки = 1;
        Для ит = 1 ПО КолвоКолонокExcel Цикл
            ИмяКолонки = "К_" + ит;
            Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
            НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
        КонецЦикла;

        // ТаблицаРезультат: Формирование строк по указанному диапазону: НачСтрока - КонСтрока.
        НомерСтроки = 1;
        Пока ADODBRecordset.EOF() = 0 Цикл
            НомерСтроки = НомерСтроки + 1;

            Если НомерСтроки < first_row Тогда    // Номер строки вне диапазона считываемых строк.
                ADODBRecordset.MoveNext();             // Следующая строка.
                Продолжить;
            КонецЕсли;

            Если last_row > 0 И НомерСтроки > last_row Тогда    // Номер строки вне диапазона считываемых строк.
                Прервать;
            КонецЕсли;

            НоваяСтрока = ТаблицаРезультат.Добавить();
            НоваяСтрока.НомерСтроки = НомерСтроки;

            Для ит = 1 ПО КолвоКолонокExcel Цикл
                Поле = ADODBRecordset.Fields.Item(ит - 1);

                Если Поле.ActualSize = 0 Тогда        // Пустое поле EXCEL.
                    Продолжить;
                КонецЕсли;

                ЗначениеЯчейки = Поле.Value;        // Учитывая параметр HDR=YES в строке соединения, данные считываются в соответствии с их типом.

                ИмяКолонки = "К_" + ит;
                НоваяСтрока[ИмяКолонки] = СтрЗаменить(ЗначениеЯчейки, Символы.НПП, "");

                // Используется при формировании таблицы на форме обработки.
                ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
                ДлинаСтроки      = СтрДлина(СокрЛП(ЗначениеЯчейки));
                ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);

            КонецЦикла;

            ADODBRecordset.MoveNext();   // Следующая строка.

        КонецЦикла;

        Schema.MoveNext();
    КонецЦикла;

    ADODBRecordset.Close();
    ADODBConnection.Close();
    ADODBRecordset   = Неопределено;
    ADODBConnection = Неопределено;
    Сообщить(ТаблицаРезультат.Количество());

    Возврат ТаблицаРезультат;
КонецФункции

--------------------------------------------------------------------------------

#SaveReportBuilderSettings
// НастройкиПостроителя - реквизит обработки (Строка, неогр)

// событие формы
Процедура ПередСохранениемЗначений(Отказ)
	НастройкиПостроителя = ЗначениеВСтрокуВнутр(ПостроительОтчета.ПолучитьНастройки());
КонецПроцедуры

Процедура ВосстановитьНастройкиПостроителя()
	Если СокрЛП(НастройкиПостроителя) <> "" Тогда
        Попытка
            ПостроительОтчета.УстановитьНастройки(ЗначениеИзСтрокиВнутр(НастройкиПостроителя));
        Исключение
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

// событие формы
Процедура ПриОткрытии()
	ВосстановитьНастройкиПостроителя();
КонецПроцедуры

// событие формы
Процедура ПослеВосстановленияЗначений()
	ВосстановитьНастройкиПостроителя();
КонецПроцедуры