Добрый день, хорошим людям. Вот просвещаюсь по учебнику Радченка М. Г. "1С Предприятие 8.2 Практическое пособие разработчика" 2009 г. Установлена платформа 1С:Підприємство 8.2 (8.2.16.352). Есть документ "ОказаниеУслуг", при проведении документа необходимо контролировать остатки материалов на складе, которые им списываются. Соответственно режим проведения документа - оперативный. Указывает в свойствах документа "ОказаниеУслуг" - Оперативне проведення : дозволити.
Запускаю отладчик, точку останову ставлю на начале процедуры "ОбработкаПроведения" и режим проведения документа "Неоперативный"
//Создать менеджер временных таблиц МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос; //Указать, какой менедж6ер ВТ использует этот запрос Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = "ВЫБРАТЬ | ОказаниеУслугПереченьНоменклатуры.Номенклатура, | ОказаниеУслугПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | СУММА(ОказаниеУслугПереченьНоменклатуры.Количество) КАК КоличествоВДокументе, | СУММА(ОказаниеУслугПереченьНоменклатуры.Сумма) КАК СуммаВДокументе |ПОМЕСТИТЬ НоменклатураДокумента |ИЗ | Документ.ОказаниеУслуг.ПереченьНоменклатуры КАК ОказаниеУслугПереченьНоменклатуры |ГДЕ | ОказаниеУслугПереченьНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ОказаниеУслугПереченьНоменклатуры.Номенклатура, | ОказаниеУслугПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить();
// Запрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ; Запрос2.Текст = "ВЫБРАТЬ | НоменклатураДокумента.Номенклатура, | НоменклатураДокумента.ВидНоменклатуры, | НоменклатураДокумента.КоличествоВДокументе, | НоменклатураДокумента.СуммаВДокументе, | ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость, | ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество |ИЗ | НоменклатураДокумента КАК НоменклатураДокумента | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки( | , | Материал В | (ВЫБРАТЬ | НоменклатураДокумента.Номенклатура | ИЗ | НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки | ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки( | , | Материал В | (ВЫБРАТЬ | НоменклатураДокумента.Номенклатура | ИЗ | НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки | ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал"; //Установим необходимость блокировки изменяемых данных в регистрах //СтоимостьМатериалов и ОстаткиМатериалов Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина; Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;
//Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе. Движения.СтоимостьМатериалов.Записать(); Движения.ОстаткиМатериалов.Записать();
Результат = Запрос2.Выполнить(); //ТЗ = Результат.Выгрузить(); ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда СтоимостьМатериала = 0; Иначе СтоимостьМатериала = ВыборкаДетальныеЗаписи .Стоимость / ВыборкаДетальныеЗаписи.Количество; КонецЕсли; Если ВыборкаДетальныеЗаписи .ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
// регістр ОстаткиМатериалов Расход Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; //Регистр СтоимостьМатериалов расход Движение = Движения.СтоимостьМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе *СтоимостьМатериала; КонецЕсли; //Регистр продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Клиент = Клиент; Движение.Мастер = Мастер; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе; Движение.Стоимость = СтоимостьМатериала *ВыборкаДетальныеЗаписи.КоличествоВДокументе; КонецЦикла; // Просмотреть нет ли отрицательных остатоков по материалам после // проведения документа. Движения.Записать(); //Режим - параметр процедуры ОбработкаПроведения(...) Если Режим = РежимПроведенияДокумента.Оперативный Тогда //Проверить отрицательные отстатки Запрос3 = Новый Запрос; Запрос3.МенеджерВременныхТаблиц = МенеджерВТ; Запрос3.Текст = "ВЫБРАТЬ | ОстаткиМатериаловОстатки.Материал, | ОстаткиМатериаловОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиМатериалов.Остатки( | , | Материал В | (ВЫБРАТЬ | НоменклатураДокумента.Номенклатура | ИЗ | НоменклатураДокумента) | И Склад = &Склад) КАК ОстаткиМатериаловОстатки |ГДЕ | ОстаткиМатериаловОстатки.КоличествоОстаток < 0"; Запрос3.УстановитьПараметр("Склад",Склад); Результат = Запрос3.Выполнить(); ТЗ = Результат.Выгрузить();
ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не хватает " + Строка(-ВыборкаДетальныеЗаписи .КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """"; Сообщение.Сообщить(); //Параметр процедуры Отказ = Истина; КонецЦикла; КонецЕсли;
Попытка XML_Doc= Новый COMОбъект("MSXML2.DOMDocument.4.0"); Исключение Сообщить("Не удалось создать xml документ"); КонецПопытки; XML_Doc.load("D:\xmltest.xml"); Попытка srvXmlHttp_SPR_TOV= Новый COMОбъект("MSXML2.xmlHttp.4.0"); Исключение Сообщить("Не удалось создать запрос"); КонецПопытки; Попытка srvXmlHttp_SPR_TOV.OPEN("POST","http://192.168.1.100:1002",1); srvXmlHttp_SPR_TOV.setRequestHeader("Content-Type", "text/xml;charset=UTF-8"); srvXmlHttp_SPR_TOV.SEND(XML_Doc); Исключение Сообщить("Не удалось отправить на шлюз данные"); КонецПопытки;
может файл кодировки/кириллицы у вас "битый"? есть небольшая вероятность.
Как это проверить?
Цитата(Acid @ 05.07.13, 9:37)
могу предложить такой вариант - все символы названия формируйте в кодах utf-8. самый верняк будет.
В какой момент форматировать символы в utf-8? В момент создания xml файл в 1C?.....
В предыдущем посте я уже писал что 1С создает xml файл корректно, проверял вручную загружая в программу "шлюз",а на отправляя в эту программу с 1С. Проблема именно в момент передачи xml файл с 1С на программу "шлюз".
ошибка платформы 1с скорее всего. 1 вариант - попробуйте одинарные кавычки, либо другой символ. 2 вариант - если создать хмл-файл и сохранить на диске, а потом посмотреть этот файл. эта И будет присутствовать? Еще есть вероятность того, что двойная кавычка в шлюзе завершает тег. В общем пробуйте другой символ. Тильду например.
Готовтесь к тому, чтобы шлюз подбирал хмл-файл.
День добрый! 1-й вариант. Любой другой символ, в не зависимости будет он стоять возле кавычек или сам по себе, прописная это буква будет или маленькая в xml файле от будет отображаться корректно. Проблема именно в заглавной букве И. 2-и вариант. Если сохранить xml файле на диске и открыть буква будет присутствовать. Так же в первом посте писал, что возможно этот xml файле загрузить в программу "шлюз" вручную(есть кнопочка импорт) после этого касса эго заберет и в чеке буква И отображается правильно.
Хотите сказать чтоб попробовать ~ вместьо буквы И? А смысл? Кавычки роли не играют. Что так:
Skodnik, ну, это попытка угадать, т.к. наверняка я сказать не могу. А вообще, по хорошему, надо попробовать отправить это, хотя бы, из 1С 8. Может это какой-то баг 7.7. И да, попробуйте ещё вообще строку заголовков убрать.
Строку заголовка убрать пробовал раньше, со строкой:
устанавливает заголовок протоколу HTTP, назначение "Content-Type" - Формат и способ представления сущности., т.е что в запросе будет "text/xml", а кодировка ему "windows-1251" Требования к xml файлу, который формирует 1С, такие: "ПО должно формировать файл в кодировке UTF-8(без BOM)".
Подскажите советом, как решить такую ситуацию. Имеем: 1С 7.70. 0.25, конфигурация не стандартная, стороннюю программу - называется "шлюз" и кассовый аппарат с GSM модемом. Написана обработка, которая создает xml-файл -"Справочник товаров" и отправляет его на "шлюз". "Шлюз" установлен на отдельном компьютере, написанный на Java, использует: Java v.7 Update 21, слушает 1000 порт (для обмена с 1С) и 1002 (для обмена с кассовым аппаратом ). Сделан проброс трафика с внешнего ip на машину со "шлюзом" на порт 1002, т.е кассовый аппарат подключатся по внешнему ip к порту 1002 "шлюза" и передает\принимает данные.
В обработке для работы с xml файлами использую MSXML парсер. XML документ создаю:
XML_Doc=CreateObject("MSXML2.DOMDocument.4.0");
На основе данных с 1С заполняю XML файл и в результате получаю:
Попытка srvXmlHttp_SPR_TOV= СоздатьОбъект("MSXML2.xmlHttp.4.0"); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Попытка srvXmlHttp_SPR_TOV.OPEN("POST","http:\\192.168.1.100:1000",1); srvXmlHttp_SPR_TOV.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); srvXmlHttp_SPR_TOV.SEND(XML_Doc); Исключение Сообщить(ОписнаиеОшибки()); КонецПопытки;
Отправка xml файла - "Справочника товаров" на "шлюз" проходит успешно. После этого, кассовый аппарат, используя GSM модем, подключатся через внешний ip к "шлюзу" на порт 1002 и забирает данные.
В приведенном xml файла указана одна новая позиция справочника товаров, которая появится на кассовом аппарате: Салат "Итальянский", код 430, цена 405 коп.
Проблема: В чеке на кассовом аппарате название Салат "Итальянский" печатается как Салат "??тальянский" Т.е.: если в названии товара есть заглавная буква "И" то в чеке она будет выглядеть как "??".
Есть возможность в программу "шлюз" загрузить xml файла, приведенный выше, вручную. После этого кассовый аппарат заберет эти данный и буква "И" отображается в чеке правильно.
Соответственно разработчики программы "шлюз" и кассового аппарата (одна и та же контора) своих ошибок не видят. Т.е. проблема именно в момент передачи xml файла с 1С на программу "шлюз". Ответили они так: "Ошибка может быть в момент считывания данных с файла и преобразования информации в поток байт. Либо ошибка в момент формирования HTTP-пакета так же на стороне 1С."
Пробовал этот xml файла сохранить на диск и отправить на "шлюз" используя компоненту v7plus.dll. Результата был такой же.
ЗагрузитьВнешнююКомпоненту("v7plus.dll"); Соединение = СоздатьОбъект("AddIn.V7HttpReader"); Соединение.ОтправитьДляОбработки("http://192.168.1.100:1000","D:\file.xml",1,,);
Собственно, может ктот сталкивался с таким? И\или подскажет каким еще методом можно отправить xml файл с 1С? Возможно нужно еще указывать какие то параметры при создание и\или отправке xml файла, которые касаются кодировки.
Определитесь тогда сначала, что Вам нужно удалять - диапазон или столбцы.
Удалить то надо столбцы.
Цитата(-=VJ=- @ 25.03.13, 12:11)
правильнее и проще первым ячейкам колонок давать названия и потом искать по названию, а не по номеру - тогда сколько ни добавляй, всё равно будет работать.
но легкие пути - таки да
Названия колонкам не давали, писал ведь что выгрузка происходит со сторонней программы и поменять шаблон выгрузки в ексель я не могу.
xlToLeft - это не удаление строк, это именно удаление диапазона, после которого ячейки можно сдвинуть либо влево(xlToLeft), либо вверх. Для колонок это всё необязательно. Columns(i).Delete в цикле и всё.
Мне и надо удалить диапазон с 4 колонок:"A" "B" "C" "D" и сдвинуть ячейки в лево Пример:
Со сторонней программы выгружаются данные в Ексель файл. В обработке 1С четко указано с какой колонки брать данные. Обрабатывается порядка 20 колонок. Форма Ексель файла с данными поменялась, добавилось вначале 4 колонки, вот чтоб не менять номера колонок по обработке, думаю проще удалить эти 4 столбца.
Добрый день, форумчане! То ли погода дает о себе знать, то ли еще не проснулся. Необходимо в обработке, при открытии Ексель-файла удалить первые 4 столбца:
Добрый день! Подниму тему, вот сотрудник в январе пошел в отпуск, есть сформированный приказ на отпуск, при заполнения табеля рабочего времени проставляется 8ками те дни когда он в отпуске, я руками перебил на 0, т.е пустые значения, но при печати с табеля формы П-5(сбуквенным кодом) в табеле рабочего времени прочерки стоят в тех дня когда сотрудник был в отпуске, а должна быть буква "В" и количество часов, которое сотрудник был в отпуске.
Смысл его - в повышенном контроле за наличием персонала. Данные о присутствии сотра вносятся руками в Табель. А всякие БЛ - просто начисление за дни отсутствия.
ЗЫ. Не знаю, есть ли сейчас табельные и табельщицы.
Спасибо большое, вот еще нашел http://pro1c.org.ua/index.php?showtopic=2136 З.Ы. Поделитесь ссылкой где можно почитать про способы учета отработано времени: прямой, метод отклонений. Я так понимаю это чтот должно быть "Керівництво користувача комплексної конфігураціі 1С 7.7".
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!