Возник вопрос как прикрутить к самописной конфигурации на версии 8.3.15.1565 и/или 8.3.16.1063 сканер штрих-кодов Datalogic QW2100. Система 64 разрядная, 1С тоже. Со сканерами никогда в жизни не работал, примеры гуглил, пытался ставить и драйвера 1С и Атол и ничего не получилось от слова совсем.
Написал свою обработку по нажатию F7 открывать форму куда должен попадать штрихкод и дальше по энтеру искать все что надо и вставлять куда надо, если руками нажимать F7 - данные получает от сканера, жмет энтер и все работает, но сканер сам эту форму не открывает (будто F7 не нажата). Если запустить программу для отлавливания нажатия клавиш, она выводит что F7 нажимается, префикс от сканера работает.
Выяснил что можно сделать через обработку внешнего события, попробовал написать туда код, но ничего не происходит, значит внешнее событие должно быть кем-о отправлено или как-то зарегистрировано в 1С.
Куда копать? Что ставить? Подскажите пожалуйста, надо уже пользоваться, а приходится писать руками все.
Получение данных из файла выполняется таким образом:
&НаКлиенте Процедура ПрочитатьИзмененияНаСервере(ИмяФайла) //Создать и проанализировать объект ЧтениеXML ЧтениеXML=Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); //Создать объект ЧтениеСообщенияОбмена и начать чтение сообещиня ЧтениеСообщения=ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеXML); //Прочитать содержимое тела сообещения ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); //Закончить чтение сообщения и чтение XML ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); КонецПроцедуры
&НаКлиенте Процедура ПрочитатьИзменения(Команда) ИмяXMLФайла=РазархивироватьФайл(РабочийКаталог+ИмяЗагрузки); ПрочитатьИзмененияНаСервере(ИмяXMLФайла); Предупреждение("Чтение изменений завершено.",10); КонецПроцедуры
А записывается в файл так:
&НаКлиенте Процедура ЗаписатьИзмененияНаСервере(Узел,ИмяФайла) //Создать и проанализировать объект ЗаписьXML ЗаписьXML=Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайла); //Создать объект ЗаписьСообщенияОбмена и начать запись сообщения. ЗаписьСообщения=ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел); //Записать содержимое тела сообщения обмена данными распределенной ИБ ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения); //Закончить запись сообщения и запись XML ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); КонецПроцедуры
Добрый день, есть самописная конфигурация (не мной) тянущаяся с 7.7 до 8.3 версии, приложение обычное, но были попытки переводить его в управляемое, так что теперь это комбайн из обычного приложения, в котором местами есть управляемые формы. Так вот, задача имея форму управляемого приложения в обработке, которая делает обмен между базами, вывести в строку состояния обычного приложения (или окошко состояния, не важно) при помощи метода Состояние() прогресс самого обмена, условно, видеть хотя бы какой процент имеющихся изменений в файле обмена изменений уже обработаны (при загрузке) или же наоборот уже записаны в файл (при выгрузке). Есть ли вообще такая возможность и если да, то каким способом делается?
Добрый день всем. Дали на сопровождение базу (кочует с 7.7, пытались переводить "по живому" на управляемое приложение из обычного, добрались до версии 1с 8.3.8.1933 и спихнули мне), в которой обнаружились "тормоза". Замером производительности нашел где:
всего = тбНачисления.Количество(); сч = 1; Удаления = Новый Массив;
Пока сч <= всего Цикл Удаления.Очистить(); строка = тбНачисления[сч - 1]; Для каждого стрНач Из тбНачисления Цикл Если строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР") И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоНаименованию("ЕСВ ФОТ (больничные инвалиды)") И стрНач.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР") И стрНач.ФизЛицо = строка.ФизЛицо Тогда
Попытка Если стрНач.БазаРасчета <> строка.БазаРасчета И стрНач.БазаРасчетаВсего <> строка.БазаРасчетаВсего Тогда
Удаления.Добавить("Истина"); Иначе Удаления.Добавить("Ложь"); КонецЕсли; Исключение Продолжить; КонецПопытки; КонецЕсли; Если строка.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные И стрНач.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные И стрНач.ФизЛицо = строка.ФизЛицо Тогда
Если стрНач.ДатаНачала = строка.ДатаНачала И стрНач.ДатаОкончания = строка.ДатаОкончания И стрНач.Результат > строка.Результат Тогда
Удаления.Добавить("Истина"); КонецЕсли;
КонецЕсли; КонецЦикла;
Если Удаления.Найти("Ложь") = Неопределено И Удаления.Количество() <> 0 Тогда тбНачисления.Удалить(сч - 1); всего = всего - 1; Иначе сч = сч + 1; КонецЕсли; КонецЦикла;
С одной стороны вроде логично со счетчиком это все очищать от лишних записей, но когда сия зараза вызывается почти 2 миллиона раз это занимает почти 2 часа (по словам бухгалтера, замером производительности результат получился около 5000 секунд). Если честно, сам с 1с не настолько давно работаю и более оптимального варианта не знаю, потому прошу помощи, каким образом это вот чудо можно переписать, чтобы оно быстрее работало?
Уточню, конкретно тормозят строки
Если строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
и
И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоНаименованию("ЕСВ ФОТ (больничные инвалиды)")
Во первых, поля тз надо типизировать. Во-вторых, прежде чем делать манипуляции, все отправленные тз необходимо поместить в вт. В-третьих, если какая ошибка возникает, будьте добры публиковать ее текст.
Ошибка вот такая:
{Форма.Форма.Форма(161)}: Ошибка при вызове метода контекста (Выполнить) Результат = Запрос.Выполнить(); по причине: При выборе данных из объекта в запросе не могут присутствовать соединения и объединения
Есть две таблицы значений, нужно из одной таблицы исключить все записи, которые имеются в другой таблице. Думал сделать запросом через левое соединение, но не работает, говорит что при выборе не могут быть соединения. Народ, очень срочно нужно, помогите как-нибудь, как подобное решить можно.
Таблица из которой надо удалять:
ТаблицаУБ = Новый ТаблицаЗначений; ТаблицаУБ.Колонки.Добавить("Дата"); ТаблицаУБ.Колонки.Добавить("Счет"); ТаблицаУБ.Колонки.Добавить("Сумма"); ТаблицаУБ.Колонки.Добавить("Валюта"); ТаблицаУБ.Колонки.Добавить("ИНН");
Таблица в которой содержится что надо удалять:
ТаблицаСписок = Новый ТаблицаЗначений; ТаблицаСписок.Колонки.Добавить("ИНН"); ТаблицаСписок.Колонки.Добавить("ФизЛицо")
Критерий для определения строк - колонка ИНН (она и там и там есть) Пробовал делать вот так:
Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТЗУБ", ТаблицаУБ); Запрос.УстановитьПараметр("ТЗС", ТаблицаСписок);
Запрос.Текст = "ВЫБРАТЬ | ТЗУБ.Дата, | ТЗУБ.Счет, | ТЗУБ.Сумма, | ТЗУБ.Валюта, | ТЗУБ.ИНН | ПОМЕСТИТЬ ТЗУБ |ИЗ | &ТЗУБ КАК ТЗУБ | ЛЕВОЕ СОЕДИНЕНИЕ ТЗС КАК ТЗС | ПО ТЗУБ.ИНН = ТЗС.ИНН |ГДЕ | ТЗС.ИНН ЕСТЬ NULL "; Результат = Запрос.Выполнить();
Как раз вчера столкнулся с подобным. Не могли войти с компа под Win7 на сервер под Win8. Оказалось, Win7 была настроена на обновления. Запретил их, удалил последние - заработало.
А какое именно? Да, а под wine обновлений вообще же нет.
Возникает ошибка "Внутренняя ошибка. Ожидается возможность запуска". Ни кода ошибки, ни дополнительной информации, только счетчик 60 секунд и кнопка отмены. Соответственно клиент не запускается, ошибка возникает на 1 машине под Windows и на 2 под wine. Может кто подскажет куда копать? Версия 1С 8.3.6, сервер 1С на Windows, клиенты - windows, linux, wine.
Итак, нашел кое-какое решение для устранения этой печали, поставил PostgreSQL 9.3 с офсайта 1С. Теперь заполнение документа выполняется более-менее быстро (15-20 сек), но возникает другая беда. При работе двух и более пользователей все ждут пока кто-то один работает с уведомлением (через htop) LOCK TABLE waiting. Я так полагаю стоит блокировка всей таблицы сразу, а как можно по умолчанию указать блокировку только строк?
Вот с такими настройками журнала: Имею вот такие записи:
Потратил пол дня вчера и вот еще почти три часа сегодня, чтобы открыть великое таинство дерева "Документы" в правах... Права, которые устанавливаются в 1 никак не влияют на права в 2, там их надо отдельно стравить. Оказалось у меня для пользователя не было прав чтения/изменения последовательностей.
Спасибо всем за участие, проблема решена, тему можно закрывать.
Добавил новую роль для пользователя, документ калькуляция, возникает ошибка "нарушение прав доступа" вот в таком коде:
Если Модифицированность() тогда Записать(РежимЗаписиДокумента.Запись); КонецЕсли;
который находится в процедуре "ОбработкаПроведения" в модуле объекта этого же документа. На регистры права дал "чение/изменение", документы и справочники все какие есть - "чтение/изменение/удаление/добавление", для этого документа нет прав только для интерактивных удалений. Куда копать дальше? Журнал регистраций говорит об отмене транзакций при Данные.Изменить в справочнике Партии, на который так же есть все права кроме интерактивных удалений. Уже голову сломал, вроде бы все разрешено, а не пускает.
Версия 1С 8.3.5, конфигурация самописная.
Кстати, просто записать тоже не дает по той же ошибке.
Всем довольно часто приходится выполнять запросы к базе для получения различной информации, порой составить запрос бывает трудно. Предлагаю вот такую небольшую диаграмму в помощь:
Простите, не знал в какой раздел положить, потому запихиваю сюда. Возможно информация кому-то будет полезной.
Доброго времени суток всем, подскажите кто пользовался запуском 1с из командной строки, как можно запустить конфигуратор в автоматическом режиме для выгрузки cf файла? У нас разработка ведется на соответствующей базе, в которую каждую ночь заливается копия основной, для получения свежих данных. Иногда возникают случаи, когда запарят мозг и перед уходом с работы забываешь сохранить конфигурацию в файл, утром приходишь и никаких изменений там соответственно нет. Хотелось бы подстраховаться и перед бекапом снимать конфигурационный файлик. Скрипт бекапа есть, куда вставить команду знаю, а вот какая это команда - без понятия. Где-то была статейка в интернете с перечнем всех ключиков, а найти не могу. Знаю есть команда для получения dt:
Доброе утро всем. Столкнулся с проблемой в запросах. Конфигурация с 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)
С такими параметрами, самое простое - заполнение документа "начисление зарплаты" по 1 сотруднику - выполняется 471 секунду! Этот же запрос на PostgreSQL 9.1 и 1С 8.2 под тем же линуксом выполнялс почти мгновенно (до 1 секунды). Текущие версии: 1С - 8.3.5.1231 PostgreSQL - 9.2.4
Проверил только что, окончательно рабочий объект XDTO для схемы J1201507.xsd, работает и готов к использованию (медок глотнул на ура), вот его схема. В код осталось добавить только генерацию имени файла и обработку каждой строки из сформированного реестра.
В общем оказалось все не так-то просто =) Пришлось еще раз переделать XDTO, выходной XML придется еще подправлять дополнительно, хотя, может быть, когда допишу код и все выложу, меня кто-то поправит. К концу недели думаю получится полностью готовую обработку для реестра налоговых накладных.
Итак, спустя неделю, я таки добился рабочего объекта XDTO. Он выглядит вот так - скачать схему xsd. Сейчас доделаю код, который это все заполняет и так же выложу рядом. Что касается каких-либо изменений от налоговой и как их вносить:
Находим что изменилось в оригинальном xsd в сравнении с предыдущей версией
Измененные элементы находим и правим в нашем новом xsd
Меняем пространство имен в нашем новом xsd на правильное
Загружаем наш новый xsd в систему 1С
По надобности подправляем обработку вывода, правим элементы и т.д.
Теоретически должно быть универсально.
Да, уточню, данный xsd - это рабочий объект XDTO для схемы J1201507.xsd которая находится в архиве налоговой и актуальна на данный момент.
Я бы вашу проблему попробовал решить на организационном уровне: объяснить директору, что для нормальной выгрузки налоговой отчетности нужен комп с 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 как должен быть, только вот зараза эти два типа не принимает и сохранять пакет не хочет
Разобрался, нужно было для DGDateEndKv указать тип из того же пакета DGDate, а для DGpercentAlloc указать тоже из того же пакета DGdecimal2. Все сохранилось нормально. Единственное теперь нужно разрулить структуру, например, для элемента T1RXXXXG1 нужно добавить два свойства: ROWNUM и __content, где в первый записывать номер строки, а во второй собственно говоря само значение.
Ну и читать колонки слева на право построчно (взял колонку, записал все строки), а не как по умолчанию - строку взял, все колонки записал и т.д.
Надо в конфе сделать поиск по "Новый COMОбъект("Msxml2.DOMDocument" и смотреть. Смотрел по Бухгалтерии - не так уж и много. Методы и свойства в основном аналогичные. По поводу COMОбъект("Msxml2.XMLSchemaCache.4.0") ничего не скажу, т. к. не знаком с этим объектом, но в Бухгалтерии этот код закомментирован.
Попробую выдрать из бухгалтерии тогда, чтоль... Может там сделано уже без этого как-то внутренними методами, пока туда еще не вникал.
// формируем имя файла //данные всегда берутся из служебной области Если Сред (ИмяСхемы,1,4) = "JFSS" Тогда КодВФонде = СокрЛП(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаОтчетФССУтратаТрудосп.CSTRAX); ИмяФайла = "Z" + КодВФонде + ".xml"; Иначе КодНалоговой = ДополнитьСтрокуСимволами(СокрЛП(Формат(спПараметры.ДанныеОтчета.ПолеТабличногоДокументаСлужебныеДанные.C_STI,"ЧЦ=4;ЧГ=0")),"0",4 ,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(элДокумента);
Для Каждого СтрокаТела Из тбПоказателиТело Цикл Если СтрокаТела.Тип = "Таблица" Тогда ИмяНужнойГруппы = "";
тбПоказателиТаблицы = СтрокаТела.Таблица; Если Префикс = Неопределено Или Не ЗначениеЗаполнено(Префикс) Тогда ИмяНужнойГруппы = ПолучитьИзСтруктурыГруппы(тбПоказателиТаблицы[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") Тогда
//<!--Загальний тип "Індивідуальний податковий номер "--> Если НЕ ЗначениеЗаполнено(Значение) Тогда Результат = 0; ИначеЕсли ТипЗнч(Значение)=Тип("Строка") Тогда Результат = СтрЗаменить(Значение, " ", ""); Результат = СтрЗаменить(Результат, ",", "."); ИначеЕсли ТипЗнч(Значение)=Тип("Число") Тогда Результат = Формат(Значение,"ЧДЦ=0; ЧГ=0"); Иначе Результат = СокрЛП(Строка(Значение)); КонецЕсли;
Попытка Контроль = Число(Результат); Если Найти(Результат, ".") > 0 ИЛИ Контроль < 1000 ИЛИ Контроль > 999999999999 ИЛИ Цел(Контроль) <> Контроль Тогда ОписаниеОшибки = "Значение не является целым числом от 1000 до 999999999999"; КонецЕсли; Исключение ОписаниеОшибки = "Значение не является целым числом от 1000 до 999999999999"; КонецПопытки;
// проверка аттрибутов Если НЕ ЗначениеЗаполнено(QDATE) ИЛИ НЕ ТипЗнч(QDATE) = Тип("Дата") Тогда СтрокаОшибки = ТаблицаОшибок.Добавить(); СтрокаОшибки.ИмяТабличногоПоля = "ПолеТабличногоДокументаНалоговыйДокумент"; СтрокаОшибки.ИмяПоказателя = "T1Z" + Формат(ROWNUM,"ЧЦ=4;ЧВН=0;ЧГ=;") + "QDATE"; СтрокаОшибки.ОписаниеОшибки = "Не заполнена дата"; КонецЕсли;
Если Не ЗначениеЗаполнено(QNUM) и НЕ ЗначениеЗаполнено(RNUM) Тогда СтрокаОшибки = ТаблицаОшибок.Добавить(); СтрокаОшибки.ИмяТабличногоПоля = "ПолеТабличногоДокументаНалоговыйДокумент"; СтрокаОшибки.ИмяПоказателя = "T1Z" + Формат(ROWNUM,"ЧЦ=4;ЧВН=0;ЧГ=;") + "QNUM"; СтрокаОшибки.ОписаниеОшибки = "Не указан ни номер налоговой накладной ни номер расчета корретировки"; КонецЕсли;
Error = ДокЭкспорт.parseError; Если Error.errorCode<>0 Тогда // есть ошибка фОшибка = 1; Сообщить(НСтр("ru = 'Ошибка:'; uk = 'Помилка:'")); Сообщить(Error.reason); КонецЕсли;
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!