1с 77 запрос не оперирует величинами типа строка неопределенной длины
Платформа: 7.70.027<br>Конфигурация: любая<br><br>А у нас в реквизите неопределенного типа строка хранится с длиной не более чем 22 символа что ли?<br><br>Пример, в котом видно грабли:<br>Конфигуарция 1С:Предприниматель 7.7, релиз 7.70.155, типовой.<br>1. Создаем новый документ "Строка выписки банка (приход)".<br>2. В форме имеется поле для занесения "Платежного документа". Записываем туда строковое представление, например "Платежное поручение №365 от 02.07.2009 г.", сохраняем документ, закрываем его<br>3. Открываем его снова и видим, что в поле то указано только "Платежное поручение №3"
> Платформа: 7.70.027<br>> Конфигурация: любая<br>> <br>> А у нас в реквизите неопределенного типа строка хранится с длиной не более чем 22 символа что ли?<br>> <br>> Пример, в котом видно грабли:<br>> Конфигуарция 1С:Предприниматель 7.7, релиз 7.70.155, типовой.<br>> 1. Создаем новый документ "Строка выписки банка (приход)".<br>> 2. В форме имеется поле для занесения "Платежного документа". Записываем туда строковое представление, например "Платежное поручение №365 от 02.07.2009 г.", сохраняем документ, закрываем его<br>> 3. Открываем его снова и видим, что в поле то указано только "Платежное поручение №3"<br><br>для хранения неопределенного типа отводится 22 литерала для представления внутренного хранения
Безобразие, в общем. Переделал, теперь у меня все норм, остальным сочуствую
> Безобразие, в общем. Переделал, теперь у меня все норм, остальным сочуствую<br><br>какова реализация?
А там 1С сама сделала предпосылки для реализации, просто тестировали на троечку, вот и не работает у них в конфигурации как положено. В документе имеется скрытый реквизит определенного типа "Строка", в котором хранится истинное значение. Нужно лишь при открытии формы диалога переносить его в элемент управления формы диалога, который имеет неопределенный тип. Они в ПриОткрытии() написали:<br><br>Если Выбран()=0 Тогда<br>. переносим значение в реквизит формы<br><br>вот с чего так то? Зачем сделали "Если Выбран()=0 Тогда"? перенос значения в реквизит формы делать надо в любом случае, хоть записан документ (наш пример), хоть создается новый (ВводНового() срабатывает до ПриОткрытии() и в скрытые реквизиты заносятся какие то значения и тоже должны быть перенесены в элементы управления формы). Короче, лишняя срезка там стояла, я ее заремкал и все заработало как положено.
//******************************************************************************
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"// |ОбрабатыватьДокументы все;
|з_текДок = Документ.ДвижениеРегистра.ТекущийДокумент;
|з_ДокОснование = Документ.ДвижениеРегистра.ДокументОснование;
|з_ИдРегистра = Документ.ДвижениеРегистра.ИдРегистра;
|Группировка з_текДок;
|Условие(з_ДокОснование = ДокументОснование);
|Условие(СокрЛП(з_ИдРегистра) = СокрЛП(ИдРегистра));
|"//>>ЗАПРОС
;
//// Если ошибка в запросе, то выход из процедуры
//Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
// Возврат;
//КонецЕсли;
Пока Запрос.Группировка(1) = 1 Цикл
Предупреждение("Уже есть документ: "+Запрос.з_текДок);
КонецЦикла;
переменная текущийдокумент
группировка по документу
условие по этой переменной на предмет совпадения с требуемым видом документа
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: з_текДок = Документ. <<?>> ДвижениеРегистра.ТекущийДокумент;
Запрос[3] : Неверно заданный путь 'ДвижениеРегистра'
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: з_ДокОснование = Документ. <<?>> ДвижениеРегистра.ДокументОснование;
Запрос[4] : Неверно заданный путь 'ДвижениеРегистра'
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: з_ИдРегистра = Документ. <<?>> ДвижениеРегистра.ИдРегистра;
Запрос[5] : Неверно заданный путь 'ДвижениеРегистра'
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: Группировка з_текДок <<?>> ;
Запрос[6] : Переменная 'з_текДок' не опеределена
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: Условие(з_ДокОснование = ДокументОснование <<?>> );
Запрос[7] : Ошибка в условии
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: Условие(СокрЛП(з_ИдРегистра) = СокрЛП(ИдРегистра) <<?>> );
Запрос[8] : Ошибка в условии
Теперь эту лажу выдает, была ошибка в название документа.
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: з_ДокОснование = Документ.ДвиженияРегистра. <<?>> ДокументОснование;
Запрос[4] : Неверно заданный путь 'ДокументОснование'
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: Условие(з_ДокОснование = ДокументОснование <<?>> );
Запрос[7] : Ошибка в условии
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
: Условие(СокрЛП(з_ИдРегистра) = СокрЛП(ИдРегистра) <<?>> );
Запрос[8] : Ошибка в условии
(7) Запрос не поддерживает строки неограниченной длины. А смысл, если судить по названию реквизита "ИдРегистра", ему иметь тип "строка неограниченной длины".
(8) vcv, Вот вся процедура, хочу запретить повторный ввод документа по регистру.
Подскажите как лучше сделать?
ДокОснование = ДокументОснование;
// глЗаполнитьНаОсновании(Контекст,ДокументОснование,0);
глЗаполнитьШапку(Контекст);
СписокРегистров = СоздатьОбъект("СписокЗначений");
Для Сч = 1 По Метаданные.Регистр() Цикл
Рег = СоздатьОбъект("Регистр." + Метаданные.Регистр(Сч).Идентификатор);
Если Рег.ВыбратьДвиженияДокумента(ДокОснование) = 1 Тогда
СписокРегистров.ДобавитьЗначение(Метаданные.Регистр(Сч).Идентификатор, Метаданные.Регистр(Сч).Представление());
КонецЕсли;
КонецЦикла;
ИДРегистра = "";
Если СписокРегистров.РазмерСписка() > 1 Тогда
ПодчДоки = СоздатьОбъект("Документ");
ПодчДоки.ВыбратьПодчиненныеДокументы(,,ДокОснование);
Пока ПодчДоки.ПолучитьДокумент() = 1 Цикл
Если ПодчДоки.Проведен() = 0 Тогда Продолжить; КонецЕсли;
Если ПодчДоки.Вид() <> "ДвиженияРегистра" Тогда Продолжить; КонецЕсли;
НомЗнч = СписокРегистров.НайтиЗначение(ПодчДоки.ИдРегистра);
Если НомЗнч <> 0 Тогда
СписокРегистров.УдалитьЗначение(НомЗнч);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если СписокРегистров.РазмерСписка() = 0 Тогда
Предупреждение("В " + ДокОснование + " нет движений по регистрам!",60);
СтатусВозврата(0);Возврат;
ИначеЕсли СписокРегистров.РазмерСписка() = 1 Тогда
ИДРегистра = СписокРегистров.ПолучитьЗначение(1);
ИначеЕсли СписокРегистров.ВыбратьЗначение(ИДРегистра. ) = 0 Тогда
СтатусВозврата(0);Возврат;
КонецЕсли;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"// |ОбрабатыватьДокументы все;
|з_текДок = Документ.ДвиженияРегистра.ТекущийДокумент;
|з_ДокОснование = Документ.ДвиженияРегистра.ДокОснование;
|з_ИдРегистра = Документ.ДвиженияРегистра.ИдРегистра;
|Группировка з_текДок;
|Условие(з_ДокОснование = ДокументОснование);
|Условие(СокрЛП(з_ИдРегистра) = СокрЛП(ИдРегистра));
|"//>>ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока Запрос.Группировка(1) = 1 Цикл
сообщить(Запрос.ЗначениеУпорядочивания(1).СтрокаНеограниченнойДлины);
Предупреждение("Уже есть документ: "+Запрос.з_текДок);
КонецЦикла;
Рег = СоздатьОбъект("Регистр." + ИДРегистра);
Рег.ВыбратьДвиженияДокумента(ДокОснование);
Пока Рег.ПолучитьДвижение() = 1 Цикл
НоваяСтрока();
Знак = Рег.Приход;
НК = 0;
Для Сч = 1 По Метаданные.Регистр(ИдРегистра).Измерение() Цикл
НК = НК + 1;
Атрибут=Метаданные.Регистр(ИдРегистра).Измерение(сч);
НазначитьТип( "Кол" + Строка(НК), Атрибут.Тип + ?(ПустоеЗначение(Атрибут.Вид) = 0,"."+Атрибут.Вид,""), Атрибут.Длина,Атрибут.Точность);
УстановитьАтрибут("Кол" + Строка(НК), Рег.ПолучитьАтрибут(Метаданные.Регистр(ИдРегистра).Измерение(сч).Идентификатор));
ИдКолонок = ИдКолонок + Метаданные.Регистр(ИдРегистра).Измерение(Сч).Идентификатор + глРС;
КонецЦикла;
Для Сч = 1 По Метаданные.Регистр(ИдРегистра).Реквизит() Цикл
НК = НК + 1;
Атрибут=Метаданные.Регистр(ИдРегистра).Реквизит(сч);
НазначитьТип( "Кол" + Строка(НК), Атрибут.Тип + ?(ПустоеЗначение(Атрибут.Вид) = 0,"."+Атрибут.Вид,""),Атрибут.Длина, Атрибут.Точность);
УстановитьАтрибут("Кол" + Строка(НК), Рег.ПолучитьАтрибут(Метаданные.Регистр(ИдРегистра).Реквизит(сч).Идентификатор));
ИдКолонок = ИдКолонок + Метаданные.Регистр(ИдРегистра).Реквизит(Сч).Идентификатор + глРС;
КонецЦикла;
Для Сч = 1 По Метаданные.Регистр(ИдРегистра).Ресурс() Цикл
НК = НК + 1;
Атрибут=Метаданные.Регистр(ИдРегистра).Ресурс(сч);
НазначитьТип( "Кол" + Строка(НК),Атрибут.Тип + ?(ПустоеЗначение(Атрибут.Вид) = 0,"."+Атрибут.Вид,""),Атрибут.Длина,Атрибут.Точность);
УстановитьАтрибут("Кол" + Строка(НК), Рег.ПолучитьАтрибут(Метаданные.Регистр(ИдРегистра).Ресурс(сч).Идентификатор));
ИдКолонок = ИдКолонок + Метаданные.Регистр(ИдРегистра).Ресурс(Сч).Идентификатор + глРС;
КонецЦикла;
КонецЦикла;
1П:Предприятие 7.7 для SQL (7.70.027)
Конфигурация
"Бухгалтерский учет" для Украины (7.70.252)
Нужно в таблицу с полями (№п/п, Дата, Документ, Касса, Сумма, Примечание)
вывести ПриходныйКассовый ордер (ПКО) и РасходныйКассовый ордер (РКО) за период
с сортировкой 1) Касса 2) Дата
ДокРКО пока закоментил, так как сортировка еще не работает
vadim007 --> vadim007Не работает ((
1) Ошибка в запросе, закоментив строку в запросе с Примечанием, проходим дальше
2. Показывает что выполнил запрос и вернул одну строку
nysysimara --> nysysimaraа примечание можно потом вывести
1С Предприятие 8.3: Бух.предприятия 3.0 + самописка
Кроме высшего образования, нужно иметь хотя бы среднее соображение
Yoja --> YojaНашел еще один способ решить эту задачу:
1: Создаем таблицу значений
2: Получаем объект документ РКО
3: Выгружаем то что нужно
4: Получаем объект документ ПКО
5: Выгружаем то что нужно
6: Сортируем
7: Выгружаю в Таблицу
8: Сохраняем в Excel
Седьмой пункт можно было бы и пропустить, однако таблица сохраняется в Excel файл одной строкой
"Добрый день. В конторе потребовалась табличка вида: Номер Акта --- полное наименование услуги<br> <br>полное наименование услуги спокойно можно увидеть в печатной форме выбранного документа, но мне нужно получить табличку за нужный период а точнее за квартал<br> <br>вот код, сделал мастером<br>при выполнении выдает ошибку:<br><br>Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда<br>: Наименование2 = Документ.ОказаниеУслуг.Услуга.полнНаименование <<?>>);<br>Запрос[7]: Запрос не оперирует величинами типа "Строка" неопределенной длины<br><br>Что-то можно сделать?<br> <br>Процедура Сформировать()<br> Перем Запрос, ТекстЗапроса, Таб;<br> //Создание объекта типа Запрос<br> Запрос = СоздатьОбъект("Запрос");<br> ТекстЗапроса = <br> "//>ЗАПРОС <br> <br><br> ;<br> // Если ошибка в запросе, то выход из процедуры<br> Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда<br> Возврат;<br> КонецЕсли;<br><br> // Подготовка к заполнению выходных форм данными запроса<br> Таб = СоздатьОбъект("Таблица");<br> Таб.ИсходнаяТаблица("Сформировать");<br> // Заполнение полей "Заголовок"<br> Таб.ВывестиСекцию("Заголовок");<br> Состояние("Заполнение выходной таблицы. ");<br> Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);<br> Пока Запрос.Группировка(1) = 1 Цикл<br> // Заполнение полей ОказаниеУслуг<br> Таб.ВывестиСекцию("ОказаниеУслуг");<br> Пока Запрос.Группировка(2) = 1 Цикл<br> // Заполнение полей Услуга<br> Таб.ВывестиСекцию("Услуга");<br> Пока Запрос.Группировка(3) = 1 Цикл<br> // Заполнение полей Наименование<br> Таб.ВывестиСекцию("Наименование");<br> КонецЦикла;<br> КонецЦикла;<br> КонецЦикла;<br> // Вывод заполненной формы<br> Таб.ТолькоПросмотр(1);<br> Таб.Показать("Сформировать", """");<br>КонецПроцедуры"
Читайте также: