Работа с файлами Excel

Работа с файлами Excel

MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.

Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.

Обмен через табличный документ
Обмен через OLE
Использование COMSafeArray
Обмен через ADO
Выгрузка без программирования



Обмен через табличный документ

Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:

  • Записать(<ИмяФайла>, <ТипФайлаТаблицы>) для выгрузки данных в файл;
  • Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>) для загрузки данных из файла.

Внимание!

Метод Записать() доступен как на клиенте, так и на сервере. Метод Прочитать() доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.


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

ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:

  • XLS95 — формат Excel 95;
  • XLS97 — формат Excel 97;
  • XLSX — формат Excel 2007.

Загрузка из файла осуществляется также достаточно просто:

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);

Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:

  • Значение;
  • Текст.

Обмен через OLE

Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:

  • На компьютере конечного пользователя, если обмен происходит на стороне клиента;
  • На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.

Пример выгрузки:

// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель.WorkBooks.Add();
// Позиционирование на первом листе
Лист = Книга.Worksheets(1);

// Запись значения в ячейку
Лист.Cells(НомерСтроки, НомерКолонки).Value = ЗначениеЯчейки;

// Сохранение файла
Книга.SaveAs(ИмяФайла);

// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;

Примеры чтения:

// —— ВАРИАНТ 1 ——

// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Открытие книги
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;

// Закрытие книги
Книга.Close(0);

// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;

 

// —— ВАРИАНТ 2 ——

// Открытие книги
Книга = ПолучитьCOMОбъект(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;

// Закрытие книги
Книга.Application.Quit();

Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:

// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
     ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
КонецЦикла;

// —— ВАРИАНТ 2 ——
НомерСтроки = 0;
Пока Истина Цикл
     НомерСтроки = НомерСтроки + 1;
     ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
     Если НЕ ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
         Прервать;
     КонецЕсли;
КонецЦикла;

Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:

ВсегоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;

Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();

В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:

Действие Код Комментарий
Работа с приложением
Установка видимости окна приложения Эксель.Visible = Ложь;
Установка режима вывода предупреждений (выводить/не выводить) Эксель.DisplayAlerts = Ложь;
Закрытие приложения Эксель.Quit();
Работа с книгой
Создание новой книги Книга = Эксель.WorkBooks.Add();
Открытие существующей книги Книга = Эксель.WorkBooks.Open(ИмяФайла);
Сохранение книги Книга.SaveAs(ИмяФайла);
Закрытие книги Книга.Close(0);
Работа с листом
Установка текущего листа Лист = Книга.WorkSheets(НомерЛиста);
Установка имени Лист.Name = Имя;
Установка защиты Лист.Protect();
Снятие защиты Лист.UnProtect();
Установка ориентации страницы Лист.PageSetup.Orientation = 2; 1 — книжная, 2 — альбомная
Установка левой границы Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры);
Установка верхней границы Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры);
Установка правой границы Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры);
Установка нижней границы Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры);
Работа со строками, колонками, ячейками
Установка ширины колонки Лист.Columns(НомерКолонки).ColumnWidth = Ширина;
Удаление строки Лист.Rows(НомерСтроки).Delete();
Удаление колонки Лист.Columns(НомерКолонки).Delete();
Удаление ячейки Лист.Cells(НомерСтроки, НомерКолонки).Delete();
Установка значения Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Объединение ячеек Лист.Range(Лист.Cells(НомерСтроки, НомерКолонки), Лист.Cells(НомерСтроки1, НомерКолонки1)).Merge();
Установка шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Name = ИмяШрифта;
Установка размера шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Size = РазмерШрифта;
Установка жирного шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Bold = 1; 1 — жирный шрифт, 0 — нормальный
Установка курсива Лист.Cells(НомерСтроки, НомерКолонки).Font.Italic = 1; 1 — курсив, 0 — нормальный
Установка подчеркнутого шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Underline = 2; 2 — подчеркнутый, 1 — нет

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

Использование COMSafeArray

При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.

// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок1 Цикл
     Для Кол = 0 По ВсегоКолонок1 Цикл
         МассивКом.SetValue(Кол, Стр, Значение);
     КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value = МассивКом;

Обмен через ADO

Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.

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

Пример выгрузки:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);

// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения

// Создание COM-объекта для команды
Команда = Новый COMОбъект(«ADODB.Command»);
Команда.ActiveConnection = Соединение;

// Присвоение текста команды для создания таблицы
Команда.CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)»;
Команда.Execute(); // Выполнение команды

// Присвоение текста команды для добавления строки таблицы
Команда.CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)»;
Команда.Execute(); // Выполнение команды

// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение.Close();
Соединение = Неопределено;

Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:

// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект(«ADOX.Catalog»);
Книга.ActiveConnection = Соединение;

// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект(«ADOX.Table»);
Таблица.Name = «Лист1»;
Таблица.Columns.Append(«Колонка1», 202);
Таблица.Columns.Append(«Колонка2», 7);
Таблица.Columns.Append(«Колонка3», 5);
Таблица.Columns.Append(«Колонка4», 5);

// Создание в книге листа с описанной структурой
Книга.Tables.Append(Таблица);
Таблица = Неопределено;
Книга = Неопределено;

В приведенном примере в методе

Таблица.Columns.Append(«Колонка1», 202);

во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:

  • 5 — adDouble;
  • 6 — adCurrency;
  • 7 — adDate;
  • 11 — adBoolean;
  • 202 — adVarWChar;
  • 203 — adLongVarWChar.

Пример чтения:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);

// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения

// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект(«ADODB.Recordset»);
ТекстЗапроса = «SELECT * FROM [Лист1$]»;

// Выполнение запроса
Выборка.Open(ТекстЗапроса, Соединение);

// Обход результата выборки
Пока НЕ Выборка.EOF() Цикл
     ЗначениеКолонки1 = Выборка.Fields.Item(«Колонка1»).Value; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка.Fields.Item(0).Value; // Обращение по индексу колонки
     Выборка.MoveNext();
КонецЦикла;

Выборка.Close();
Выборка = Неопределено;
Соединение.Close();
Соединение = Неопределено;

В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:

  • YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
  • NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.

В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:

  • Connection;
  • Command;
  • Recordset;
  • Record;
  • Fields;
  • Stream;
  • Errors;
  • Parameters;
  • Properties.

Выгрузка без программирования

Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.

Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.

Сохранение табличного документа 1С

В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.

Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:

  1. Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
  2.   Сохранить табличный документ в требуемый формат.

Сохранение динамического списка
 

Остались вопросы?
Спросите в комментариях к статье.

 

Смотри также:

Преобразование объекта XDTO в текст
Работа с файлами DBF
Основные способы обмена 1С с другими системами

20 комментариев

  1. Отлично!
    Такое разнообразие и ни одного варианта без COM-объекта, чтоб работало на линуксе.

    1. Author

      Разве обмен через табличный документ вызывает ошибку в линуксе?

  2. Howdy terrific blog! Does running a blog such as this take a massive
    amount work? I’ve virtually no expertise in coding but I was
    hoping to start my own blog soon. Anyways, if you have any recommendations or tips for new blog owners please share.

    I understand this is off topic however I simply had to ask.
    Kudos!

  3. Ремонт скважин в Минске и Минской области
    Услуги по ремонту скважин в Минске становятся все более востребованными. В последние годы люди стали более вдумчиво относиться к вопросу своего здоровья, поскольку наибольшее влияние на состояние здоровья оказывает окружающая среда и то, что мы из нее черпаем. Незаменимой в жизни и деятельности человека остается вода, ведь ее влияние на наш организм поистине велико. Улучшать качество воды люди научились по-разному: в квартирах появились разного рода фильтры, водоочистительные системы, а кто-то и вовсе покупает питьевую воду, состав и происхождение которой весьма сомнительны.
    Состояние скважины и чистота воды Люди, знакомые с нынешними технологиями, предпочитают воду из скважин, пробуренных на своем участке. Подобный вариант считается эффективнее, поскольку такая вода очищена от загрязнений самой природой и существенно отличается от водопроводной полезным химическим составом. Большинство скважин на участках находится в пределах Минска и Минской области. Пользуясь скважиной, нужно понимать, что она, как и другое оборудование, нуждается в уходе. Несмотря на долгосрочность служения, не исключены потребности мелкого ремонта скважины и очищения от скопившихся отложений.Необходимость проведения ремонта скважины
    Опираясь на количество ремонтных работ в Минске и Минской области, сотрудники компании «БурАвтоГрупп» составили список основных случаев ремонта:Повреждение водоподъемного оборудования
    Изношенное состояние обсадных труб или же повреждение сальниковых устройств
    Снижение дебита. Если вода поступает плохо, не стоит тут же делать вывод, что она вышла из строя. Подобная проблема требует тщательной проверки и поиска проблемы. В конечном итоге, каждая из этих причин исправима правильным планом ремонта и качественной технологией его выполнения.
    Разновидность работ по ремонту скважин в Минске
    Прочистка скважины предполагает проведение следующих работ:
    Скребкование
    Метод свабирования
    Метод гидравлического удара
    Пневмоимпульсный метод
    Вибрационные и звуковые методы.
    Каждый из них подразумевает улучшение проходимости скважины посредством чистки ее от рыхлых осадков, ставших причиной закупорки внутренней поверхности и фильтров.Трубы и из замена
    Более трудоемкий процесс подразумевает замещение обсадных труб с их извлечением по различным причинам. Такие виды работ выполняются, если нет возможности поместить в скважину другую колонну меньшего диаметра. Подобная колонна при опускании создает гидравлический удар, в результате которого образование скорости подачи воды выше, чем ранее.
    Ремонт скважинного оборудования в Минске
    Это одна из «популярных» причин выхода скважины из строя, а ее ремонт подразумевает замену насоса. Основные точки обрывов — это места стыкования оборудования или труб между собой. Главной причиной обрыва в любом месте остается коррозия.Стоимость ремонта скважин в Минске Стоимость ремонта в Минске и области будет завесить от трех факторов:
    Тип поломки Состояние самой скважины Ее местоположение. Вопросы гарантии При заключении контракта на бурение или ремонт скважины в Минске с нашей компанией, вы получаете гарантию на оказанный вид ремонтных работ. В последующем вы сможете быть спокойны за техническую исправность вашей скважины, а ваша семья получит по-настоящему чистую, вкусную и полезную воду. Отметим, что наша компания оказывает полный комплекс услуг по водоснабжению — бурение скважин в Минске, обустройство, установку насосного оборудования и др.

  4. Una lesión en el pene, la columna vertebral, la próstata, la vejiga y la pelvis puede llevar a DE, produciendo lesión en los nervios, músculos lisos, arterias y tejidos fibrosos de los cuerpos cavernosos. Puede que esta razón te haya dejado un poco descolocado, así que explicaremos a continuación a que nos referimos con esto.

  5. Профессиональный монтаж напольных покрытий.Обращайтесь всегда рады вам помочь.
    Мы делаем следующие работы
    Монтаж напольного плинтуса из массива
    Монтаж напольного плинтуса МДФ
    Монтаж напольного плинтуса дюрополимер
    Монтаж напольного плинтуса ПВХ
    Монтаж напольного плинтуса ЛДФ
    Монтаж потолочного плинтуса.
    Монтаж напольного плинтуса из металла и т.д кроме камня.
    Покраска плинтуса.
    Монтаж напольных покрытий
    Монтаж паркетной доски на подложку.
    Монтаж ламината.
    Монтаж винилового ламината
    Монтаж инжинерной доски
    Монтаж моссивной доски (с готовым покрытием)
    Монтаж фанеры.
    Монтаж галтелий и наличников.
    По другим работам уточняйте!
    гарантия на все виды работ.
    Напилим.про

  6. Доброго времени суток товарищи
    Артезианская и песчаная виды скважин.
    Ориентируясь на цели и нужды своего заказчика компания “БурТехСервис” выполняет бурение как скважин на песок (до первого водоносного слоя – песчаный слой), так и артезианских скважин, расположенных глубже (водоносный слой известняк, в котором естественными способами отфильтровывается вода).

    Давайте разберемся, какому типу скважин отдать предпочтение.

    Сравнение артезианского и песчаного типов скважин
    Критерий

    Скважина на песок

    Артезианская скважина

    Глубина

    Бурение осуществляется на небольшую глубину до первого водоносного (песчаного) слоя – 20-60 метров

    При бурении артезианской скважины можно достичь большой глубины (до 250 метров)

    Срок службы

    10-20 лет при условии регулярной эксплуатации

    Срок службы составляет свыше 50 лет независимо от регулярности эксплуатации

    Дебит (производительность) скважины

    Небольшой – около 600 литров в час

    Большой дебит скважины (до 20 м3 в час)

    Особенности монтажа

    Сложности при монтаже и эксплуатации оборудования для подачи воды.

    Не возникает трудностей при монтаже и использовании оборудования.

    Фильтр

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

    Необходимости в установке фильтров нет, поскольку вода в известняковом слое отфильтровывается и обеззараживается естественными способами

    Затраты

    Скважины на песок – популярный и незатратный способ провести воду в дом

    Затраты гораздо выше ввиду сложностей проведения буровых работ и монтажа оборудования

    Объём водоснабжения

    Воды хватает на покрытие нужд лишь одного дома

    Водоснабжения с лихвой хватает на весь частный сектор или посёлок.

    skvazhina-na-pesok
    Скважина на песок
    artezianskaya-skvazhina
    Артезианская скважина
    Скважина на песок
    Популярность этого типа скважин обусловлена доступной ценой и быстротой построения. Весь процесс состоит из следующих этапов:

    Бурение скважины роторным или шнековым способом.
    В пробуренное отверстие монтируем обсадную трубу. В качестве обсадных труб используем трубы нПВХ из пищевого пластика ?90 или ?125. Они наиболее эффективно обеспечивают целостность ствола скважины и защищают оборудование от различных механических нагрузок извне
    После этого устанавливаем 3-метровый фильтр из полиамидной сетки галунного плетения европейского производства. Он защищает воду от попадания в нее песка и других загрязнений.
    Обсыпка фильтра фильтрующим песком
    Прокачка скважины до визуально чистой воды.
    Подбор и установка насосного оборудования.
    После того как скважина пробурена и установлен насос для обеспечения подъема воды на поверхность, рекомендуется обустроить скважину необходимым оборудованием. Обустройство скважины продляет срок ее эксплуатации, сохраняя ее в работоспособном состоянии долгие годы. С вариантами обустройства вы можете ознакомиться здесь.

    Артезианская скважина (на известняк)
    В артезианской скважине водоносный слой находится между двумя слоями известняковой породы на достаточно большой глубине – до 250 метров. Это обеспечивает воде непревзойденное качество и чистоту. Установка фильтров не требуется – на такой глубине вода отфильтровывается естественными способами.

    Скважина артезианского типа бурится роторном способом. Существует 4 вида конструкции артезианской скважины;

    Стандартная. В этом случае в грунтовом слое не содержится песка и глины, а давление воды очень высокое. Скважину оснащают одной металлической обсадной трубой. Диаметр трубы может достигать 159 мм. Не требует глубокого погружения насоса — воду можно добывать уже при наполненности 2 труб — до этой отметки она поднимается спокойно.
    С двойной обсадной трубой. В грунтовом слое имеется и песок, и глина, а давление воды очень слабое – самый оптимальный вариант для проведения работ. Без глинистых слоев встречаются довольно редко, потому чаще монтируется скважина с двойной обсадной трубой. Дополнительный элемент монтируется в зоне с сухим известняком.
    С кондуктором. В грунтовом слое не имеется песка и глины, давление воды высокое, но могут существовать преграды в верхних слоях – плывуны. Именно там монтируется кондуктор. Это помогает компенсировать давление.
    Телескопическая конструкция. Применяется в местах с неустойчивым грунтом с камнями и валунами. Конструкцию называют телескопической, так как здесь используется сразу три обсадных металлических трубы. Это позволяет компенсировать сильное давление среды.
    В распоряжении “БурТехСервис” имеется полной набор специальной техники, необходимой для проведения буровых работ на всех этапах, включая земельные работы. Вы можете ознакомиться со буровыми комплектами , а также с фотографиями техники в процессе работы.

    Свяжитесь с нами по телефону или оставьте заявку,наш специалист проконсультирует вас по всем вопросам бурения, а также обустройства скважин. В компании “БурТехСервис” работают высококвалифицированные и опытные специалисты по бурению — после окончания работ у вас будет сооружена автономная скважина с чистой водой.

  7. I want to be a Rail transportation occupation and have been working towards it.

  8. Hi, how are you? It is really cool to find an entire community of people interested in the same thing you are.

  9. Asking questions are really nice thing if you are not understanding something totally, however this post provides pleasant understanding yet. skor breda fötter stockholm haamo.prizsewoman.com/map8.php

Добавить комментарий

Ваш e-mail не будет опубликован.