Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Войти | Зарегистрироваться )



4 страниц V   1 2 3 > » 

>  Сканер Datalogic QW2100 и самописаня 1с
Veizdem
Отправлено: 07.01.20, 10:17


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Добрый день всем!

Возник вопрос как прикрутить к самописной конфигурации на версии 8.3.15.1565 и/или 8.3.16.1063 сканер штрих-кодов Datalogic QW2100. Система 64 разрядная, 1С тоже. Со сканерами никогда в жизни не работал, примеры гуглил, пытался ставить и драйвера 1С и Атол и ничего не получилось от слова совсем.

Написал свою обработку по нажатию F7 открывать форму куда должен попадать штрихкод и дальше по энтеру искать все что надо и вставлять куда надо, если руками нажимать F7 - данные получает от сканера, жмет энтер и все работает, но сканер сам эту форму не открывает (будто F7 не нажата). Если запустить программу для отлавливания нажатия клавиш, она выводит что F7 нажимается, префикс от сканера работает.

Выяснил что можно сделать через обработку внешнего события, попробовал написать туда код, но ничего не происходит, значит внешнее событие должно быть кем-о отправлено или как-то зарегистрировано в 1С.

Куда копать? Что ставить? Подскажите пожалуйста, надо уже пользоваться, а приходится писать руками все.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #159083 · Ответов: 3 · Просмотров: 1491
 

>  Обмен между базами Состояние()
Veizdem
Отправлено: 18.11.16, 11:46


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Получение данных из файла выполняется таким образом:
&НаКлиенте
Процедура ПрочитатьИзмененияНаСервере(ИмяФайла)
    //Создать и проанализировать объект ЧтениеXML
    ЧтениеXML=Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    //Создать объект ЧтениеСообщенияОбмена и начать чтение сообещиня
    ЧтениеСообщения=ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
    //Прочитать содержимое тела сообещения
    ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
    //Закончить чтение сообщения и чтение XML
    ЧтениеСообщения.ЗакончитьЧтение();
    ЧтениеXML.Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьИзменения(Команда)
    ИмяXMLФайла=РазархивироватьФайл(РабочийКаталог+ИмяЗагрузки);
    ПрочитатьИзмененияНаСервере(ИмяXMLФайла);
    Предупреждение("Чтение изменений завершено.",10);
КонецПроцедуры


А записывается в файл так:
&НаКлиенте
Процедура ЗаписатьИзмененияНаСервере(Узел,ИмяФайла)
    //Создать и проанализировать объект ЗаписьXML
    ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяФайла);
    //Создать объект ЗаписьСообщенияОбмена и начать запись сообщения.
    ЗаписьСообщения=ПланыОбмена.СоздатьЗаписьСообщения();
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел);
    //Записать содержимое тела сообщения обмена данными распределенной ИБ
    ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);
    //Закончить запись сообщения и запись XML
    ЗаписьСообщения.ЗакончитьЗапись();
    ЗаписьXML.Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьИзменения(Команда)
    ИмяФайлаБезРасширения=Лев(ИмяВыгрузки,Найти(ИмяВыгрузки,".")-1);
    ИмяФайлаXML=РабочийКаталог+ИмяФайлаБезРасширения+".xml";
    ЗаписатьИзмененияНаСервере(ПолеВводаОтделение,ИмяФайлаXML);
    ЗаархивироватьФайл(РабочийКаталог+ИмяФайлаБезРасширения);
    ЗаписатьИзмененияНаСервере(ПолеВводаОтделение,ИмяФайлаXML);
    Предупреждение("Запись изменений завершена.",10);
КонецПроцедуры
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #119459 · Ответов: 4 · Просмотров: 1970
 

>  Обмен между базами Состояние()
Veizdem
Отправлено: 18.11.16, 10:33


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Добрый день, есть самописная конфигурация (не мной) тянущаяся с 7.7 до 8.3 версии, приложение обычное, но были попытки переводить его в управляемое, так что теперь это комбайн из обычного приложения, в котором местами есть управляемые формы. Так вот, задача имея форму управляемого приложения в обработке, которая делает обмен между базами, вывести в строку состояния обычного приложения (или окошко состояния, не важно) при помощи метода Состояние() прогресс самого обмена, условно, видеть хотя бы какой процент имеющихся изменений в файле обмена изменений уже обработаны (при загрузке) или же наоборот уже записаны в файл (при выгрузке). Есть ли вообще такая возможность и если да, то каким способом делается?
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #119452 · Ответов: 4 · Просмотров: 1970
 

>  Оптимизировать время выполнения
Veizdem
Отправлено: 31.07.16, 13:00


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Vofka @ Сегодня, 13:32 *,
В плане сделать что-то вроде этого?
ПоискПоКоду1 = ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР");
Цикл.....
Если строка.Значение = ПоискПоКоду1 Тогда
....


Заработало! ) Теперь всего 200 секунд на все. Спасибо огромное, у меня совсем из головы вылетело что "НайтиПоКоду" и им подобное это же запрос к базе.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #114974 · Ответов: 2 · Просмотров: 2085
 

>  Оптимизировать время выполнения
Veizdem
Отправлено: 31.07.16, 12:15


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Добрый день всем. Дали на сопровождение базу (кочует с 7.7, пытались переводить "по живому" на управляемое приложение из обычного, добрались до версии 1с 8.3.8.1933 и спихнули мне), в которой обнаружились "тормоза". Замером производительности нашел где:
всего = тбНачисления.Количество();
    сч = 1;
    Удаления = Новый Массив;
    
    Пока сч <= всего Цикл
        Удаления.Очистить();
        строка = тбНачисления[сч - 1];
        Для каждого стрНач Из тбНачисления Цикл
            Если строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
                И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные
                И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоНаименованию("ЕСВ ФОТ (больничные инвалиды)")
                И стрНач.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
                И стрНач.ФизЛицо = строка.ФизЛицо Тогда
                
                Попытка
                    Если стрНач.БазаРасчета <> строка.БазаРасчета
                        И стрНач.БазаРасчетаВсего <> строка.БазаРасчетаВсего Тогда
                    
                        Удаления.Добавить("Истина");
                    Иначе
                        Удаления.Добавить("Ложь");
                    КонецЕсли;
                Исключение
                    Продолжить;
                КонецПопытки;
            КонецЕсли;
            Если строка.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные
                И стрНач.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные
                И стрНач.ФизЛицо = строка.ФизЛицо Тогда
                
                Если стрНач.ДатаНачала = строка.ДатаНачала
                    И стрНач.ДатаОкончания = строка.ДатаОкончания
                    И стрНач.Результат > строка.Результат Тогда
                    
                    Удаления.Добавить("Истина");
                КонецЕсли;
                
            КонецЕсли;
        КонецЦикла;  
            
        Если Удаления.Найти("Ложь") = Неопределено И Удаления.Количество() <> 0 Тогда
            тбНачисления.Удалить(сч - 1);
            всего = всего - 1;
        Иначе
            сч = сч + 1;
        КонецЕсли;
    КонецЦикла;

С одной стороны вроде логично со счетчиком это все очищать от лишних записей, но когда сия зараза вызывается почти 2 миллиона раз это занимает почти 2 часа (по словам бухгалтера, замером производительности результат получился около 5000 секунд). Если честно, сам с 1с не настолько давно работаю и более оптимального варианта не знаю, потому прошу помощи, каким образом это вот чудо можно переписать, чтобы оно быстрее работало?

Уточню, конкретно тормозят строки
Если строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
и
И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоНаименованию("ЕСВ ФОТ (больничные инвалиды)")
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #114971 · Ответов: 2 · Просмотров: 2085
 

>  ЛЕВОЕ СОЕДИНЕНИЕ двух таблиц значений
Veizdem
Отправлено: 21.08.15, 9:26


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(Petre @ 21.08.15, 10:22) *
Во первых, поля тз надо типизировать. Во-вторых, прежде чем делать манипуляции, все отправленные тз необходимо поместить в вт. В-третьих, если какая ошибка возникает, будьте добры публиковать ее текст.


Ошибка вот такая:

{Форма.Форма.Форма(161)}: Ошибка при вызове метода контекста (Выполнить)
    Результат = Запрос.Выполнить();                  
по причине:
При выборе данных из объекта в запросе не могут присутствовать соединения и объединения
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #102251 · Ответов: 4 · Просмотров: 5169
 

>  ЛЕВОЕ СОЕДИНЕНИЕ двух таблиц значений
Veizdem
Отправлено: 21.08.15, 9:19


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


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

Таблица из которой надо удалять:
ТаблицаУБ = Новый ТаблицаЗначений;
    ТаблицаУБ.Колонки.Добавить("Дата");
    ТаблицаУБ.Колонки.Добавить("Счет");
    ТаблицаУБ.Колонки.Добавить("Сумма");
    ТаблицаУБ.Колонки.Добавить("Валюта");
    ТаблицаУБ.Колонки.Добавить("ИНН");

Таблица в которой содержится что надо удалять:
ТаблицаСписок = Новый ТаблицаЗначений;
    ТаблицаСписок.Колонки.Добавить("ИНН");
    ТаблицаСписок.Колонки.Добавить("ФизЛицо")


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

>  Внутренняя ошибка. Ожидается возможность запуска
Veizdem
Отправлено: 14.07.15, 11:11


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(vadim007 @ 14.07.15, 11:55) *
Как раз вчера столкнулся с подобным. Не могли войти с компа под Win7 на сервер под Win8.
Оказалось, Win7 была настроена на обновления. Запретил их, удалил последние - заработало.

А какое именно? Да, а под wine обновлений вообще же нет.
  Форум: Администрирование и настройка 1С · Просмотр сообщения: #100776 · Ответов: 2 · Просмотров: 3109
 

>  Внутренняя ошибка. Ожидается возможность запуска
Veizdem
Отправлено: 14.07.15, 10:48


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Возникает ошибка "Внутренняя ошибка. Ожидается возможность запуска". Ни кода ошибки, ни дополнительной информации, только счетчик 60 секунд и кнопка отмены. Соответственно клиент не запускается, ошибка возникает на 1 машине под Windows и на 2 под wine. Может кто подскажет куда копать? Версия 1С 8.3.6, сервер 1С на Windows, клиенты - windows, linux, wine.


 ! 

Правила, п.3,4,5
 
  Форум: Администрирование и настройка 1С · Просмотр сообщения: #100772 · Ответов: 2 · Просмотров: 3109
 

>  PostgreSQL и 1С
Veizdem
Отправлено: 03.06.15, 8:25


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Нашел решение и этой проблеме в этой статье. Поставил управляемую блокировку в свойствах конфигурации и LOCK TABLE waiting исчез.
  Форум: Администрирование и настройка серверов баз данных · Просмотр сообщения: #99632 · Ответов: 6 · Просмотров: 6614
 

>  PostgreSQL и 1С
Veizdem
Отправлено: 03.06.15, 7:13


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Итак, нашел кое-какое решение для устранения этой печали, поставил PostgreSQL 9.3 с офсайта 1С. Теперь заполнение документа выполняется более-менее быстро (15-20 сек), но возникает другая беда. При работе двух и более пользователей все ждут пока кто-то один работает с уведомлением (через htop) LOCK TABLE waiting. Я так полагаю стоит блокировка всей таблицы сразу, а как можно по умолчанию указать блокировку только строк?
  Форум: Администрирование и настройка серверов баз данных · Просмотр сообщения: #99626 · Ответов: 6 · Просмотров: 6614
 

>  Нарушение прав доступа
Veizdem
Отправлено: 07.05.15, 9:47


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Вот с такими настройками журнала:
Имею вот такие записи:

Потратил пол дня вчера и вот еще почти три часа сегодня, чтобы открыть великое таинство дерева "Документы" в правах... Права, которые устанавливаются в 1 никак не влияют на права в 2, там их надо отдельно стравить. Оказалось у меня для пользователя не было прав чтения/изменения последовательностей.


Спасибо всем за участие, проблема решена, тему можно закрывать.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #98779 · Ответов: 3 · Просмотров: 4366
 

>  Нарушение прав доступа
Veizdem
Отправлено: 07.05.15, 8:52


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


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

Версия 1С 8.3.5, конфигурация самописная.

Кстати, просто записать тоже не дает по той же ошибке.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #98776 · Ответов: 3 · Просмотров: 4366
 

>  Создание запросов
Veizdem
Отправлено: 26.03.15, 11:49


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


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

Прикрепленное изображение


Простите, не знал в какой раздел положить, потому запихиваю сюда. Возможно информация кому-то будет полезной.
  Форум: 1С:Предприятие 8.3 · Просмотр сообщения: #97536 · Ответов: 0 · Просмотров: 3652
 

>  Дубликат последней строки в таблице значений
Veizdem
Отправлено: 20.03.15, 11:42


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Заполняю ТЗ циклом, смотрю в отладчике результат - она заполнена дубликатами последней добавляемой строки. Как пролечить?

1С 8.3.5, конфигурация самописная

Пока покурил самому дошло где ошибка... Было так:
str_medosmotr = ФабрикаXDTO.Создать(СтрокаТЗтип);
   Для каждого стр Из тбФизЛица Цикл
    
     ........
        
           str_medosmotr.tabnom = ТабельныйНомер;
           str_medosmotr.diln = Участок;
           str_medosmotr.fio = ФИО;
           str_medosmotr.pol = Строка(Пол);
           str_medosmotr.datanar = ДатаРождения;
           str_medosmotr.prof = Должность;
           str_medosmotr.uslsta = СтажВУсловиях;
           str_medosmotr.obsta = СтажОбщий;
           str_medosmotr.obraz = Строка(Образование);
           str_medosmotr.datapri = ДатаПриема;
           doc.medosmotr.Добавить(str_medosmotr);
КонецЦикла;

А надо было так:
Для каждого стр Из тбФизЛица Цикл
    
     ...........
        
           str_medosmotr = ФабрикаXDTO.Создать(СтрокаТЗтип);
           str_medosmotr.tabnom = ТабельныйНомер;
           str_medosmotr.diln = Участок;
           str_medosmotr.fio = ФИО;
           str_medosmotr.pol = Строка(Пол);
           str_medosmotr.datanar = ДатаРождения;
           str_medosmotr.prof = Должность;
           str_medosmotr.uslsta = СтажВУсловиях;
           str_medosmotr.obsta = СтажОбщий;
           str_medosmotr.obraz = Строка(Образование);
           str_medosmotr.datapri = ДатаПриема;
           doc.medosmotr.Добавить(str_medosmotr);
КонецЦикла;


Тему можно закрывать.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #97361 · Ответов: 0 · Просмотров: 1683
 

>  Ключи (параметры) запуска 1С
Veizdem
Отправлено: 03.03.15, 8:41


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Доброго времени суток всем, подскажите кто пользовался запуском 1с из командной строки, как можно запустить конфигуратор в автоматическом режиме для выгрузки cf файла? У нас разработка ведется на соответствующей базе, в которую каждую ночь заливается копия основной, для получения свежих данных. Иногда возникают случаи, когда запарят мозг и перед уходом с работы забываешь сохранить конфигурацию в файл, утром приходишь и никаких изменений там соответственно нет. Хотелось бы подстраховаться и перед бекапом снимать конфигурационный файлик. Скрипт бекапа есть, куда вставить команду знаю, а вот какая это команда - без понятия. Где-то была статейка в интернете с перечнем всех ключиков, а найти не могу. Знаю есть команда для получения dt:
c:/"Program Files"/1cv8/8.3.5.1231/bin/1cv8 DESIGNER /S сервер/база /N юзер /P пароль /RestoreIB имя_файла.dt

Вот как подобным образом получать *.cf файлик?

1С 8.3.5, конфигурация самописная (но эта информация в данном вопросе я так понимаю не важна).
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #96789 · Ответов: 2 · Просмотров: 2464
 

>  PostgreSQL и 1С
Veizdem
Отправлено: 15.01.15, 13:55


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(andr_andrey @ 15.01.15, 13:40) *
Если Вы нашли запрос, который действительно тормозит, тогда смотрите планы запросов и стоимости операций.


Дело в том, что я с PostgreSQL знаком без году неделю... Можно немного подробнее? Это в postgresql.conf надо смотреть?
  Форум: Администрирование и настройка серверов баз данных · Просмотр сообщения: #95235 · Ответов: 6 · Просмотров: 6614
 

>  PostgreSQL и 1С
Veizdem
Отправлено: 15.01.15, 11:02


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Доброе утро всем. Столкнулся с проблемой в запросах. Конфигурация с 8.2 перекочевала на 8.3, запускаем, вроде все работает, но в один прекрасный момент начинает жутко тормозить (процессор на 100%, все ждут пока завершится 1 запрос). Ковыряния в логах, конфигах и кодах показало следующий результат:
Со стороны PostgreSQL жутко тормозит такой запрос:
DELETE FROM _CRgActP435
    WHERE EXISTS(
    SELECT 1
    FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
    INNER JOIN (SELECT
    T4._RecorderTRef AS RecorderTRef,
    T4._RecorderRRef AS RecorderRRef,
    T4._LineNo AS LineNo_
    FROM _CRgActP435 T4
    INNER JOIN tt5 T5
    ON T4._RecorderTRef = T5._RecorderTRef AND T4._RecorderRRef = T5._RecorderRRef AND T4._LineNo = T5._LineNo LIMIT 100000) T3
    ON _CRgActP435._RecorderTRef = T3.RecorderTRef AND _CRgActP435._RecorderRRef = T3.RecorderRRef AND _CRgActP435._LineNo = T3.LineNo_
    WHERE _CRgActP435._RecorderTRef = T3.RecorderTRef AND _CRgActP435._RecorderRRef = T3.RecorderRRef AND _CRgActP435._LineNo = T3.LineNo_);

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

Тестовые компьютеры:
Сервер, где установлена PostgreSQL - два ксеона по 4 ядра 2.5 ГГц, 16 гиг оперативки, ssd 240 гб, система ubuntu server 14.04 amd64
Сервер, где установлен 1С - два ксеона по 4 ядра 2.5 ГГц, 8 гиг оперативки, RAID0 HDD 2 штуки, система debian7 server x86 (так же пробовал amd64)
Клиент, где запускается 1с - целерон 2 ядра 2.8 ГГц, 4 гига оперативки, система ubuntu 14.04 x86 (так же пробовал amd64)

Конфиг postgresql.conf

С такими параметрами, самое простое - заполнение документа "начисление зарплаты" по 1 сотруднику - выполняется 471 секунду! Этот же запрос на PostgreSQL 9.1 и 1С 8.2 под тем же линуксом выполнялс почти мгновенно (до 1 секунды).
Текущие версии:
1С - 8.3.5.1231
PostgreSQL - 9.2.4

Помогите разобраться хотя бы куда копать.
  Форум: Администрирование и настройка серверов баз данных · Просмотр сообщения: #95227 · Ответов: 6 · Просмотров: 6614
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 01.12.14, 15:33


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Проверил только что, окончательно рабочий объект XDTO для схемы J1201507.xsd, работает и готов к использованию (медок глотнул на ура), вот его схема. В код осталось добавить только генерацию имени файла и обработку каждой строки из сформированного реестра.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93867 · Ответов: 52 · Просмотров: 26102
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 01.12.14, 11:41


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


В общем оказалось все не так-то просто =) Пришлось еще раз переделать XDTO, выходной XML придется еще подправлять дополнительно, хотя, может быть, когда допишу код и все выложу, меня кто-то поправит. К концу недели думаю получится полностью готовую обработку для реестра налоговых накладных.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93848 · Ответов: 52 · Просмотров: 26102
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 25.11.14, 15:31


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Итак, спустя неделю, я таки добился рабочего объекта XDTO. Он выглядит вот так - скачать схему xsd. Сейчас доделаю код, который это все заполняет и так же выложу рядом. Что касается каких-либо изменений от налоговой и как их вносить:
  1. Находим что изменилось в оригинальном xsd в сравнении с предыдущей версией
  2. Измененные элементы находим и правим в нашем новом xsd
  3. Меняем пространство имен в нашем новом xsd на правильное
  4. Загружаем наш новый xsd в систему 1С
  5. По надобности подправляем обработку вывода, правим элементы и т.д.

Теоретически должно быть универсально.

Да, уточню, данный xsd - это рабочий объект XDTO для схемы J1201507.xsd которая находится в архиве налоговой и актуальна на данный момент.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93699 · Ответов: 52 · Просмотров: 26102
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 25.11.14, 9:57


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(Petre @ 25.11.14, 9:50) *
Попробуйте для первого выбрать "DGdecimal2", для второго - "DGDate". Все из этого же пакета.

Спасибо, я в схеме уже посмотрел, там было указано )
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93677 · Ответов: 52 · Просмотров: 26102
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 25.11.14, 9:41


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(Vofka @ 24.11.14, 17:24) *
Я бы вашу проблему попробовал решить на организационном уровне: объяснить директору, что для нормальной выгрузки налоговой отчетности нужен комп с Windows. А остальные пусть себе в Linux-е работают.

А директор пошлет меня куда подальше, потому что надо как минимум 7 лицензий купить...

Потому что никто к 1 компу бегать ради отчета не будет, а отчеты шлют точно 3 человека на первом офисе, и по 2 на втором и третьем, да и офисы минимум час езды в одну сторону друг от друга...

А решить проблему еще более круто - всех в 1 офис загнать, точно никто не согласится.

В общем при попытке добавить common_types.xsd как объект XDTO вылезла вот такая ошибка:
Цитата
Ошибка проверки модели XDTO: xdto-valueType-6.1 тип: DGpercentAlloc пакет: common_types
Атомарная модель содержания не соответствует определению типа значения
Ошибка проверки модели XDTO: xdto-valueType-6.1 тип: DGDateEndKv пакет: common_types
Атомарная модель содержания не соответствует определению типа значения
Посмотрел - а там по сути тип и не указан... Что нужно выбрать и откуда как в поле тип для данных элементов?
Схема если что вот - скачать схему

По сути пакет придется в полуручном режиме делать, так как требует небольших модификаций, но хоть типы сразу все готовые будут, вроде бы все получается и вывод считай 1 в 1 как должен быть, только вот зараза эти два типа не принимает и сохранять пакет не хочет sad.gif

Разобрался, нужно было для DGDateEndKv указать тип из того же пакета DGDate, а для DGpercentAlloc указать тоже из того же пакета DGdecimal2. Все сохранилось нормально. Единственное теперь нужно разрулить структуру, например, для элемента T1RXXXXG1 нужно добавить два свойства: ROWNUM и __content, где в первый записывать номер строки, а во второй собственно говоря само значение.

Ну и читать колонки слева на право построчно (взял колонку, записал все строки), а не как по умолчанию - строку взял, все колонки записал и т.д.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93668 · Ответов: 52 · Просмотров: 26102
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 24.11.14, 16:39


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(Petre @ 24.11.14, 16:12) *
Надо в конфе сделать поиск по "Новый COMОбъект("Msxml2.DOMDocument" и смотреть. Смотрел по Бухгалтерии - не так уж и много. Методы и свойства в основном аналогичные.
По поводу COMОбъект("Msxml2.XMLSchemaCache.4.0") ничего не скажу, т. к. не знаком с этим объектом, но в Бухгалтерии этот код закомментирован.

Попробую выдрать из бухгалтерии тогда, чтоль... Может там сделано уже без этого как-то внутренними методами, пока туда еще не вникал.
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93641 · Ответов: 52 · Просмотров: 26102
 

>  XDTO и регламентированная отчетность
Veizdem
Отправлено: 24.11.14, 16:03


Говорящий
***

Группа: Пользователи
Сообщений: 96
Регистрация: 17.07.14
Из: Кривой Рог, Украина
Пользователь №: 37238


Цитата(Petre @ 24.11.14, 15:40) *
минимизировать переписывание кода

Это самое то, чего хочу, только вот глядя на код конфигурации, понимаю что менять придется 100% того что есть sad.gif
Процедура ВыгрузкаПоСхеме(ИмяСхемы, НужнаяСтруктура, тбПоказателиШапка,тбПоказателиТело, фОшибка, Схема, ИмяТабличногоПоля, ТаблицаОшибок)
    перем ИмяНужнойГруппы, СтруктураНужнойГруппы;
    
    // формируем имя файла
    //данные всегда берутся из служебной области
    Если Сред (ИмяСхемы,1,4) = "JFSS" Тогда
        КодВФонде = СокрЛП(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаОтчетФССУтратаТрудосп.CSTRAX);
        ИмяФайла = "Z" + КодВФонде + ".xml";
    Иначе    
        КодНалоговой  = ДополнитьСтрокуСимволами(СокрЛП(Формат(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_STI,"ЧЦ=4;ЧГ=0")),"0",4 ,1); // дополним нулями слева
        
        КодФирмы       = ДополнитьСтрокуСимволами(СокрЛП(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.TIN),"0",10,1); // ЕДРПОУ
        
        МесяцПериода  = ДополнитьСтрокуСимволами(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.PERIOD_MONTH,"0",2 ,1);
        
        ГодПериода    = Формат(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.PERIOD_YEAR, "ЧЦ=4;ЧГ=;");
        
        Попытка
            СостояниеОтчета = ДополнитьСтрокуСимволами(НужнаяСтруктура.C_DOC_STAN,"0",1 ,1);
        Исключение
            СостояниеОтчета = ДополнитьСтрокуСимволами(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_DOC_STAN,"0",1 ,1);
        КонецПопытки;
        Если СостояниеОтчета = "0" Тогда
            СостояниеОтчета = "1";
        КонецЕсли;
        
        ТипОтчета = ДополнитьСтрокуСимволами(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_DOC_TYPE,"0",2 ,1);
        
        КодНалоговойОриг = "";
        Если НЕ спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.Свойство("C_STI_ORIG", КодНалоговойОриг) Тогда
            КодНалоговойОриг = КодНалоговой;
        КонецЕсли;
        КодНалоговойОриг = ДополнитьСтрокуСимволами(СокрЛП(Формат(КодНалоговойОриг,"ЧЦ=4;ЧГ=0")),"0",4 ,1);
        
        // поддержка выгрузки многостраничных отчетов
        текC_DOC_CNT = Неопределено;
        Если НужнаяСтруктура.Свойство("C_DOC_CNT", текC_DOC_CNT) Тогда
            НомерВПериоде = ДополнитьСтрокуСимволами(Строка(текC_DOC_CNT),"0",7 ,1);
        Иначе    
            НомерВПериоде = ДополнитьСтрокуСимволами(Строка(мC_DOC_CNT),"0",7 ,1);
        КонецЕсли;
        
        ТипПериода= "";
        Если НЕ спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.Свойство("PERIOD_TYPE", ТипПериода) Тогда
            ТипПериода = 1;
        КонецЕсли;
        ТипПериода = СОКРЛП(Лев(ТипПериода,1));
        
        // новый порядок формирования имени файла
        ИмяФайла = КодНалоговой + КодФирмы + ИмяСхемы+ СостояниеОтчета + ТипОтчета + НомерВПериоде + ТипПериода + МесяцПериода + ГодПериода + КодНалоговойОриг + ".xml";
        
    КонецЕсли;
    
    Сообщить(НСтр("ru='- Начало выгрузки в файл ';uk='- Початок вивантаження у файл '")+ ИмяФайла);
    
    Попытка
        ДокЭкспорт = Новый COMОбъект("Msxml2.DOMDocument.4.0");
    Исключение
        Попытка
            ДокЭкспорт = Новый COMОбъект("Msxml2.DOMDocument.3.0");
        Исключение
            фОшибка = 1;
            Возврат;
        КонецПопытки;
    КонецПопытки;
    
    pi =ДокЭкспорт.createProcessingInstruction("xml", "version=""1.0"" encoding=""windows-1251""");
    ДокЭкспорт.insertBefore(pi, ДокЭкспорт.childNodes.item(0));
    
    Если Сред (ИмяСхемы,1,4) = "JFSS" Тогда  //Если это РегламентированныйОтчетФСС тогда
        //    ДокЭкспорт.createProcessingInstruction("encoding", "'windows-1251'");
        //Если это не первый квартал, то открываем уже сформированный файл и дописываем в него
        //если открыть не удалось - ошибка.
        Если НЕ ЗначениеЗаполнено(ПолучитьИзСтруктуры("P1", НужнаяСтруктура)) Тогда
            Если НЕ ДокЭкспорт.Load(КаталогДанныхЭкспорта + "\" + ИмяФайла) Тогда
                Сообщить(НСтр("ru='Не удалось открыть файл отчета за первый квартал для добавления данных!"
                "Для экспорта нужно создать новый файл!';uk='Не вдалося відкрити файл звіту за перший квартал для додавання даних!"
                "Для експорту потрібно створити новий файл!'"), СтатусСообщения.Важное);
                //---------------------------
                Если Вопрос(НСтр("ru='Создать новый файл?';uk='Створити новий файл?'"), РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
                    Возврат;
                КонецЕсли;
                // главный элемент F4
                элДокумента = ДокЭкспорт.createElement("F4");
                ДокЭкспорт.appendChild(элДокумента);
                
                Для Каждого СтрокаШапки из тбПоказателиШапка Цикл
                    ВыгрузитьПоказатель(элДокумента, СтрокаШапки.Имя,
                    ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаШапки.Имя, НужнаяСтруктура),СтрокаШапки.Тип,ИмяСхемы));
                    Если  (СтрокаШапки.Имя = "DATA") Тогда
                        НовыйЭлемент = ДокЭкспорт.createElement(СтрокаШапки.Имя);
                        элДокумента.appendChild(НовыйЭлемент);
                        ЭлементСДанными = НовыйЭлемент;
                        Для Каждого СтрокаТела Из  тбПоказателиТело Цикл
                            НовыйЭлемент = ДокЭкспорт.createElement(СтрокаТела.Имя);
                            ЭлементСДанными.appendChild(НовыйЭлемент);
                            
                            ЭлементНужногоКвартала = НовыйЭлемент;
                            тбПоказателиТаблицы = СтрокаТела.Таблица;
                            Если ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура) = "" Тогда
                                Для Каждого строка Из  тбПоказателиТаблицы Цикл
                                    ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
                                    ПреобразоватьТипXML(Неопределено,строка.Тип,ИмяСхемы));
                                КонецЦикла;
                                ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя, "0,");
                            Иначе
                                Для Каждого строка Из  тбПоказателиТаблицы Цикл
                                    ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
                                    ПреобразоватьТипXML(ПолучитьИзСтруктуры(строка.Имя, НужнаяСтруктура),строка.Тип,ИмяСхемы));
                                КонецЦикла;
                            КонецЕсли;
                        КонецЦикла;    
                    КонецЕсли;
                КонецЦикла;
                
                ВыгрузитьПоказатель(элДокумента, "DATAF14",);
                //---------------------------
            Иначе    
                // Тут нужно разбирать загруженный файл, и писать в него необходимые данные
                УзКорень=ДокЭкспорт.DocumentElement;
                //УзОтношенияСписок=УзКорень.SelectNodes("//*[name()='Data']");
                Для ИндКор=1 По УзКорень.childNodes.Length Цикл
                    УзОтношение=УзКорень.childNodes.item(ИндКор-1);
                    Если ВРег(УзОтношение.BaseName)=ВРег("Data") Тогда
                        //Перебираем закладки P1-P4
                        Для ИндКор2 = 1 По УзОтношение.childNodes.length Цикл
                            УзелР = УзОтношение.childNodes.item(ИндКор2-1);
                            //Теперь мы "внутри" одного из разделов
                            //выбираем нужный, и пишем в него данные.
                            Если НЕ ЗначениеЗаполнено(ПолучитьИзСтруктуры(тбПоказателиТело[ИндКор2-1].Имя, НужнаяСтруктура)) Тогда
                                // сюда прописываем действия производимые с "другими периодами"
                            Иначе
                                Для Инд=1 По УзелР.childNodes.length Цикл
                                    УзелР.removechild(УзелР.childNodes.item(0));
                                КонецЦикла;
                                тбПоказателиТаблицы = тбПоказателиТело[ИндКор2-1].Таблица;
                                Для Каждого строка Из  тбПоказателиТаблицы Цикл
                                    ВыгрузитьПоказатель(УзелР, строка.Имя,
                                    ПреобразоватьТипXML(ПолучитьИзСтруктуры(строка.Имя, НужнаяСтруктура),строка.Тип,ИмяСхемы));
                                КонецЦикла
                            КонецЕсли;
                        КонецЦикла;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        Иначе // Если это первый квартал, то создаём новый файл
            
            // главный элемент F4
            элДокумента = ДокЭкспорт.createElement("F4");
            ДокЭкспорт.appendChild(элДокумента);
            
            Для Каждого СтрокаШапки из тбПоказателиШапка Цикл
                ВыгрузитьПоказатель(элДокумента, СтрокаШапки.Имя,
                ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаШапки.Имя, НужнаяСтруктура),СтрокаШапки.Тип,ИмяСхемы));
                Если  (СтрокаШапки.Имя = "DATA") Тогда
                    НовыйЭлемент = ДокЭкспорт.createElement(СтрокаШапки.Имя);
                    элДокумента.appendChild(НовыйЭлемент);
                    ЭлементСДанными = НовыйЭлемент;
                    Для Каждого СтрокаТела Из  тбПоказателиТело Цикл
                        НовыйЭлемент = ДокЭкспорт.createElement(СтрокаТела.Имя);
                        ЭлементСДанными.appendChild(НовыйЭлемент);
                        ЭлементНужногоКвартала = НовыйЭлемент;
                        тбПоказателиТаблицы = СтрокаТела.Таблица;
                        Если ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура) = "" Тогда
                            Для Каждого строка Из  тбПоказателиТаблицы Цикл
                                ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
                                ПреобразоватьТипXML(Неопределено,строка.Тип,ИмяСхемы));
                            КонецЦикла;
                            ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя, "0,");
                        Иначе
                            Для Каждого строка Из  тбПоказателиТаблицы Цикл
                                ВыгрузитьПоказатель(ЭлементНужногоКвартала, строка.Имя,
                                ПреобразоватьТипXML(ПолучитьИзСтруктуры(строка.Имя, НужнаяСтруктура),строка.Тип,ИмяСхемы));
                            КонецЦикла;
                        КонецЕсли;
                    КонецЦикла;    
                КонецЕсли;
            КонецЦикла;
            
            ВыгрузитьПоказатель(элДокумента, "DATAF14",);
            
        КонецЕсли;
    Иначе
        
        //Если это не РегламентированныйОтчетФСС тогда
        // Данные, которые зависят от схемы
        СлужебнаяСтруктура.Вставить("C_DOC",    Сред(ИмяСхемы,1,3));
        СлужебнаяСтруктура.Вставить("C_DOC_SUB",Сред(ИмяСхемы,4,3));
        СлужебнаяСтруктура.Вставить("C_DOC_VER",Число(Сред(ИмяСхемы,7,2)));
        СлужебнаяСтруктура.Вставить("SOFTWARE", "SOFTWARE");
        
        // главный элемент DECLAR
        элДокумента = ДокЭкспорт.createElement("DECLAR");
        ДокЭкспорт.appendChild(элДокумента);
        
        элДокумента.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
        элДокумента.setAttribute("xsi:noNamespaceSchemaLocation",ИмяСхемы+".xsd");
        
        элШапка = ДокЭкспорт.createElement("DECLARHEAD");
        элДокумента.appendChild(элШапка);
        
        Для Каждого СтрокаШапки из тбПоказателиШапка Цикл
            
            ОписаниеОшибки = "";
            ВыгрузитьПоказатель(элШапка,
                                СтрокаШапки.Имя,
                                ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаШапки.Имя, НужнаяСтруктура),СтрокаШапки.Тип,ИмяСхемы,ОписаниеОшибки));
                                
            Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
                СтрокаОшибки = ТаблицаОшибок.Добавить();
                СтрокаОшибки.ИмяТабличногоПоля     = ?(НужнаяСтруктура.Свойство(СтрокаШапки.Имя),ИмяТабличногоПоля,"ПолеТабличногоДокументаСлужебныеДанные");;
                СтрокаОшибки.ИмяПоказателя         = СтрокаШапки.Имя;
                СтрокаОшибки.ОписаниеОшибки     = ОписаниеОшибки;
            КонецЕсли;                                
            
        КонецЦикла;
        
        элТело = ДокЭкспорт.createElement("DECLARBODY");
        элДокумента.appendChild(элТело);
        
        СтруктураМногострочныхРазделов = спПараметры.ДанныеМногострочныхРазделов;
        
        Для Каждого СтрокаТела Из  тбПоказателиТело Цикл
            Если СтрокаТела.Тип = "Таблица" Тогда
                ИмяНужнойГруппы = "";
                
                тбПоказателиТаблицы = СтрокаТела.Таблица;
                Если Префикс = Неопределено Или Не ЗначениеЗаполнено(Префикс) Тогда
                    ИмяНужнойГруппы = ПолучитьИзСтруктурыГруппы(тбПоказателиТаблицы[0].Имя);
                Иначе
                    ИмяНужнойГруппы = ПолучитьИзСтруктурыГруппы(тбПоказателиТаблицы[0].Имя);
                    ИмяНужнойГруппы = Префикс + ИмяНужнойГруппы;
                КонецЕсли;

                СтруктураМногострочныхРазделов.Свойство(ИмяНужнойГруппы,СтруктураНужнойГруппы);
                
                //здесь будет получение из структуры "ДанныеМногостсрочных разделов"
                //строка тела соответствует таблице значений с элементами одной группы
                РеальныйИндСтроки = 1;
                
                спСтроки = Новый СписокЗначений;
                Для ИндСтроки = 0 По СтруктураНужнойГруппы.Количество() - 1   Цикл // Максимально допустимое число строк
                    
                    спЗначенияXML = Новый Соответствие;
                    Для Каждого строка Из  тбПоказателиТаблицы Цикл
                        ИмяПоказателя = ИмяПоказателяВТаблице(строка.Имя,РеальныйИндСтроки);
                        ИмяКолонки = СтрЗаменить(строка.Имя,"XXXX","");
                        Данные = СтруктураНужнойГруппы[ИндСтроки][ИмяКолонки];                
                        ОписаниеОшибки = "";
                        ЗначениеXML = ПреобразоватьТипXML(Данные,строка.Тип,ИмяСхемы,ОписаниеОшибки);
                        спЗначенияXML.Вставить(строка.Имя,ЗначениеXML);
                        Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
                            СтрокаОшибки = ТаблицаОшибок.Добавить();
                            СтрокаОшибки.ИмяТабличногоПоля     = ИмяТабличногоПоля;
                            СтрокаОшибки.ИмяПоказателя         = ИмяПоказателя;
                            СтрокаОшибки.ОписаниеОшибки     = ОписаниеОшибки;
                        КонецЕсли;                                
                        
                    КонецЦикла;
                    
                    Если СтарыйТипВыгрузки Тогда
                        Для Инд = 0 По спЗначенияXML.Количество() - 1 Цикл
                            ИмяПоказателя = тбПоказателиТаблицы[Инд].Имя;
                            ЗначениеXML = спЗначенияXML[ИмяПоказателя];
                            ВыгрузитьПоказатель(элТело, ИмяПоказателя, ЗначениеXML, Новый Структура("ROWNUM", РеальныйИндСтроки));
                        КонецЦикла;
                        РеальныйИндСтроки = РеальныйИндСтроки + 1;
                    Иначе
                        // Записываем в список
                        спСтроки.Добавить(спЗначенияXML);
                        РеальныйИндСтроки = РеальныйИндСтроки + 1;
                    КонецЕсли;
                КонецЦикла;
                
                Если НЕ СтарыйТипВыгрузки Тогда
                    // Выгружаем
                    Для Каждого Показатель Из  тбПоказателиТаблицы Цикл
                        ИмяПоказателя = Показатель.Имя;
                        Для ИндС = 0 По спСтроки.Количество() - 1 Цикл
                            спЗначенияXML = спСтроки[ИндС].Значение;
                            // Выгружаем
                            ЗначениеXML = спЗначенияXML[ИмяПоказателя];
                            ВыгрузитьПоказатель(элТело, ИмяПоказателя, ЗначениеXML,  Новый Структура("ROWNUM",ИндС+1));
                        КонецЦикла;
                    КонецЦикла;
                КонецЕсли;
            Иначе
                Если НЕ (ИмяСхемы = "R1201501" И СтрокаТела.Имя = "INN") Тогда
                    
                    ОписаниеОшибки = "";
                    ВыгрузитьПоказатель(элТело, СтрокаТела.Имя,
                                        ПреобразоватьТипXML(ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура),
                                                            СтрокаТела.Тип,
                                                            ИмяСхемы,ОписаниеОшибки));
                    
                    Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
                        СтрокаОшибки = ТаблицаОшибок.Добавить();
                        СтрокаОшибки.ИмяТабличногоПоля     = ?(НужнаяСтруктура.Свойство(СтрокаТела.Имя),ИмяТабличногоПоля,"ПолеТабличногоДокументаСлужебныеДанные");
                        СтрокаОшибки.ИмяПоказателя         = СтрокаТела.Имя;
                        СтрокаОшибки.ОписаниеОшибки     = ОписаниеОшибки;
                    КонецЕсли;                                
                    
                Иначе    
                    
                    ТаблицаЗапроса = ПолучитьИзСтруктуры(СтрокаТела.Имя, НужнаяСтруктура);
                
                    Если НЕ ТипЗнч(ТаблицаЗапроса) = Тип("ТаблицаЗначений")Тогда
                        Продолжить;        
                    КонецЕсли;
                    
                    Для каждого СтрокаТаблицы Из ТаблицаЗапроса Цикл
                        
                        ОписаниеОшибки = "";
                        
                        Значение = СтрокаТаблицы.T1ZINN;
                        QDATE = СтрокаТаблицы.T1ZQDATE;
                        QNUM  = СтрокаТаблицы.T1ZQNUM;
                        RNUM  = СтрокаТаблицы.T1ZRNUM;
                        ROWNUM = ТаблицаЗапроса.Индекс(СтрокаТаблицы) + 1;
                        
                        //<!--Загальний тип "Індивідуальний податковий номер "-->
                        Если НЕ ЗначениеЗаполнено(Значение) Тогда
                            Результат = 0;
                        ИначеЕсли ТипЗнч(Значение)=Тип("Строка") Тогда
                            Результат = СтрЗаменить(Значение, " ", "");
                            Результат = СтрЗаменить(Результат, ",", ".");
                        ИначеЕсли ТипЗнч(Значение)=Тип("Число") Тогда
                            Результат = Формат(Значение,"ЧДЦ=0; ЧГ=0");
                        Иначе
                            Результат = СокрЛП(Строка(Значение));
                        КонецЕсли;

                        Попытка
                            Контроль = Число(Результат);
                            Если    Найти(Результат, ".") > 0
                                ИЛИ Контроль < 1000
                                ИЛИ Контроль > 999999999999
                                ИЛИ Цел(Контроль) <> Контроль Тогда
                                ОписаниеОшибки = "Значение не является целым числом от 1000 до 999999999999";
                            КонецЕсли;
                        Исключение
                            ОписаниеОшибки = "Значение не является целым числом от 1000 до 999999999999";
                        КонецПопытки;
                        
                        Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
                            СтрокаОшибки = ТаблицаОшибок.Добавить();
                            СтрокаОшибки.ИмяТабличногоПоля     = "ПолеТабличногоДокументаНалоговыйДокумент";
                            СтрокаОшибки.ИмяПоказателя         = "T1Z" + Формат(ТаблицаЗапроса.Индекс(СтрокаТаблицы) + 1,"ЧЦ=4;ЧВН=0;ЧГ=;") + "INN";
                            СтрокаОшибки.ОписаниеОшибки     = ОписаниеОшибки;
                        КонецЕсли;                
                        
                        // проверка аттрибутов
                        Если НЕ ЗначениеЗаполнено(QDATE) ИЛИ НЕ ТипЗнч(QDATE) = Тип("Дата") Тогда
                            СтрокаОшибки = ТаблицаОшибок.Добавить();
                            СтрокаОшибки.ИмяТабличногоПоля     = "ПолеТабличногоДокументаНалоговыйДокумент";
                            СтрокаОшибки.ИмяПоказателя         = "T1Z" + Формат(ROWNUM,"ЧЦ=4;ЧВН=0;ЧГ=;") + "QDATE";
                            СтрокаОшибки.ОписаниеОшибки     = "Не заполнена дата";
                        КонецЕсли;
                        
                        Если Не ЗначениеЗаполнено(QNUM) и НЕ ЗначениеЗаполнено(RNUM) Тогда
                            СтрокаОшибки = ТаблицаОшибок.Добавить();
                            СтрокаОшибки.ИмяТабличногоПоля     = "ПолеТабличногоДокументаНалоговыйДокумент";
                            СтрокаОшибки.ИмяПоказателя         = "T1Z" + Формат(ROWNUM,"ЧЦ=4;ЧВН=0;ЧГ=;") + "QNUM";
                            СтрокаОшибки.ОписаниеОшибки     = "Не указан ни номер налоговой накладной ни номер расчета корретировки";
                        КонецЕсли;
                        
                        ВыгрузитьПоказатель(элТело, СтрокаТела.Имя, Результат, Новый Структура("ROWNUM, QDATE, QNUM, RNUM", ROWNUM, QDATE, QNUM, RNUM));    
                    КонецЦикла;
                    
                КонецЕсли;                
                
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    ДокЭкспорт.Save(КаталогДанныхЭкспорта +"\"+ИмяФайла);
    ГлобСтруктФайловВыгрузки.Вставить("FileName" + Лев(ИмяФайла, СтрДлина(ИмяФайла)-4), Новый ДвоичныеДанные(КаталогДанныхЭкспорта +"\" + ИмяФайла));
    
    ТекстВыгрузки = Строка(ТекстВыгрузки) + Символы.ПС + "------------------" + Символы.ПС + ДокЭкспорт.xml;
    Сообщить(НСтр("ru='- Отчет выгружен успешно!';uk='- Звіт вивантажений успішно!'"));
    
    Сообщить(НСтр("ru='-- Начало проверки отчета по xsd-схеме.';uk='-- Початок перевірки звіту по xsd-схемі.'"));
    
    Попытка
        фОшибка = 0;
        Попытка
            КэшСхем = Новый COMОбъект("Msxml2.XMLSchemaCache.4.0");
            КэшСхем.add("", Схема);
            ДокЭкспорт.Schemas = КэшСхем;
        Исключение        
        КонецПопытки;
        
        ДокЭкспорт.validateOnParse = Истина;
        ДокЭкспорт.async = Ложь;
        ДокЭкспорт.Load(КаталогДанныхЭкспорта +"\"+ИмяФайла);
        
        Error = ДокЭкспорт.parseError;
        Если Error.errorCode<>0 Тогда
            // есть ошибка
            фОшибка = 1;
            Сообщить(НСтр("ru = 'Ошибка:'; uk = 'Помилка:'"));
            Сообщить(Error.reason);
        КонецЕсли;
        
    Исключение
        фОшибка = 1;
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Сообщить(НСтр("ru='-- Проверка завершена!';uk='-- Перевірка завершена!'"), ?(фОшибка = 1,СтатусСообщения.Важное, СтатусСообщения.Обычное));    
    
КонецПроцедуры


И это только один случай и то не весь, а только шапка (
  Форум: Программирование в 1С Предприятие 8.3 · Просмотр сообщения: #93636 · Ответов: 52 · Просмотров: 26102
 

4 страниц V   1 2 3 > » 

Новые сообщения  Открытая тема (есть новые ответы)
Опрос  Опрос (есть новые голоса)
Нет новых сообщений  Открытая тема (нет новых ответов)
Нет новых голосов  Опрос (нет новых голосов)
Популярная тема  Горячая тема (есть новые ответы)
Закрыта  Закрытая тема
Нет новых  Горячая тема (нет новых ответов) Перемещена  Тема перемещена
 

RSS Текстовая версия Сейчас: 23.04.24, 20:35
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!