Хочу сдвинуть область в поле табличного документа |
Я |
11.03.09 — 12:39
ТабДок = ЭлементыФормы.ДокументРезультат;
Отдел = «Отпуск очередной»;
Область=ТабДок.НайтиТекст(Отдел);
ТабДок.ВыделенныеОбласти.сдвинуть(Область.Имя,2 ) ;
Ошибка…
{Форма.ФормаРасчетнаяВедомость(233)}: Ошибка при вызове метода контекста (Сдвинуть): Несоответствие типов (параметр номер ‘1’)
ТабДок.ВыделенныеОбласти.сдвинуть(Область.Имя,2 ) ;
1 — 11.03.09 — 12:40
НайтиТекст() не делает область выделенной
2 — 11.03.09 — 12:41
(1)+ добавь ТабДок.ТекущаяОбласть() = Область;
3 — 11.03.09 — 12:50
ТабДок.ТекущаяОбласть() = Область;
ошибка…
{Форма.ФормаРасчетнаяВедомость(234,26)}: Неопознанный оператор
ТабДок.ТекущаяОбласть() <<?>>= Область;
Сделал так:
ТабДок = ЭлементыФормы.ДокументРезультат;
Отдел = «Отпуск очередной»;
Область=ТабДок.НайтиТекст(Отдел);
ТабДок.ТекущаяОбласть.Имя=Область;
ТабДок.ВыделенныеОбласти.Сдвинуть(Область.Имя,2 ) ;
ошибка…
{Форма.ФормаРасчетнаяВедомость(236)}: Ошибка при вызове метода контекста (Сдвинуть): Несоответствие типов (параметр номер ‘1’)
ТабДок.ВыделенныеОбласти.Сдвинуть(Область.Имя,2 ) ;
по причине:
Несоответствие типов (параметр номер ‘1’)
4 — 11.03.09 — 12:50
(1) а как сделать область выделенной…
5 — 11.03.09 — 12:57
У Сдвинуть() 1-й параметр — тип область, а Область.Имя — Строка. Вот что 1С тебе пишет.
(2) нужно без скобок.
6 — 11.03.09 — 13:07
(5)Сделал так , ошибок нет, но сдвиг не происходит.
ТабДок = ЭлементыФормы.ДокументРезультат;
Отдел = «Отпуск очередной»;
Область=ТабДок.НайтиТекст(Отдел);
ТабДок.ТекущаяОбласть= Область;
ТабДок.ВыделенныеОбласти.Сдвинуть(Область,20 ) ;
7 — 11.03.09 — 13:19
Попробуй для выделения использовать:
ВыделенныеОбластиТабличногоДокумента (SpreadsheetDocumentSelectedAreas)
Добавить (Add)
Синтаксис:
Добавить(<Область>)
8 — 11.03.09 — 13:44
Не могу понять в моем случие что должно выступать в роли колекции
Что не поставляю выдает ОШИБКУ….
{Форма.ФормаРасчетнаяВедомость(238)}: Итератор для значения не определен
Для каждого строка из ? цикл
КонецЦикла;
9 — 11.03.09 — 13:48
(8) видимо ТабДок.ВыделенныеОбласти
10 — 11.03.09 — 13:50
(9)Да спасибо только что сам догнал
11 — 11.03.09 — 14:19
Не могу понять как с этими методами работать…
Методы:
Вставить (Insert)
Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Очистить (Clear)
Получить (Get)
Сдвинуть (Move)
Удалить (Delete)
12 — 11.03.09 — 14:23
Пишу так ничего не происходит.
Для каждого ВыделеннаяОбласть из ТабДок.ВыделенныеОбласти цикл
ТабДок.ВыделенныеОбласти.Сдвинуть(ВыделеннаяОбласть,50 ) ;
КонецЦикла;
13 — 11.03.09 — 14:56
Кто-то может помочь!!!!!!!!!!!!!!
ПОЧЕМУ НЕРАБОТАЕТ.
Genri
14 — 11.03.09 — 16:14
Все очень красиво делается вот так….
Отдел = «Отпуск очередной»;
Область=ТабДок.НайтиТекст(Отдел);
ОблКолонка=СокрЛП(Прав(Область.Имя,2));
ТабДок.ВставитьОбласть(ТабДок.Область(«R5″+ОблКолонка+»:R200″+ОблКолонка), ТабДок.Область(«R5C3:R200C3»),,истина);
Mr-Rm
changed the title
СписокЗначений.Сдвинуть() работает циклично
СписокЗначений и ТаблицаЗначений: Сдвинуть() работает циклично
May 16, 2019
@dmpas подскажи, как автор — почему сделан циклический сдвиг? Есть ли тайный смысл в этом?
@EvilBeaver вот я пытался поковыряться на ИТС и найти какой-нибудь старый синтаксис-помощник. Вот чует моя ж, что когда-то в 1С так и было.
Ща попросим какого-нибудь старожила вспомнить…
/cc @pumbaEO @artbear @allustin ?
Судя по-всему — нет. Оно всегда работало с выдачей исключения. Я не могу найти подтверждения, что было циклично
@EvilBeaver не было такого. Я помню 8.1 я пробовал и получал исходное исключение «Неправильное смещение внутри коллекции» а вот в 7.7 1С++ вроде как смещало циклично.
Copy link
Contributor
Author
Когда первый параметр метода Сдвинуть() не является Числом или ЭлементомСпискаЗначений / СтрокойТаблицыЗначений соответственно, 1С пытается привести его к числу и выдает ошибку «Несоответствие типов (параметр номер ‘1’)» только если приведение невозможно. В OneScript происходит следующее:
СписокЗначений.Сдвинуть("2",1)
Ошибка: Значение не является значением объектного типа
ТаблицаЗначений.Сдвинуть("2",1)
Ошибка: Неверный тип аргумента
(То же и для СписокЗначений.Удалить("2")
)
Что важнее, совместимость или типизация?
Copy link
Contributor
Author
Удивительная несогласованность в 1С. Пробуем код:
ТЗ1 = Новый ТаблицаЗначений;
ТЗ1.Колонки.Добавить("К1");
Ст11 = ТЗ2.Добавить();
Ст12 = ТЗ2.Добавить();
ТЗ2 = Новый ТаблицаЗначений;
ТЗ2.Колонки.Добавить("К1");
Ст2 = ТЗ2.Добавить();
ТЗ1.Сдвинуть(Ст2,1);
Получаем ошибку: «Недопустимое значение параметра (параметр номер ‘1’) (Строка не принадлежит коллекции)«.
Теперь аналогичное:
СЗ1 = Новый СписокЗначений;
Эл11 = СЗ1.Добавить("э11");
Эл12 = СЗ1.Добавить("э12");
СЗ2 = Новый СписокЗначений;
Эл2 = СЗ2.Добавить("э2");
СЗ1.Сдвинуть(Эл2, 1);
Просто сдвигается 0-й элемент! СЗ1.Индекс(Эл2)
честно возвращает -1.
Это же баг и источник багов. Нельзя такое повторять. Есть другие мнения?
Кажется в коде примера ошибка: в строке 2 СЗ2 еще не определен
Mr-Rm
added a commit
to Mr-Rm/OneScript
that referenced
this issue
Jul 5, 2019
…параметра к индексу +тесты
EvilBeaver
added a commit
that referenced
this issue
Jul 8, 2019
Fix #876: цикличность метода Сдвинуть; приведение типа первого параметра
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
&НаКлиенте Процедура Заполнить(Команда) Если Объект.Проведен Тогда Предупреждение("Заполнение возможно только в непроведенном документе!"); Возврат; КонецЕсли; Если Объект.Контракты.Количество() > 0 Тогда ТекстВопроса = "Перед заполнением табличная часть будет очищена. Продолжить?"; Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; Объект.Контракты.Очистить(); КонецЕсли; ТЗ = ПолучитьСписокКонтрактовНаПродление(); мМаксимальныйСрокКонтрактаЛет = 5; Для Каждого Стр Из ТЗ Цикл НоваяСтрока = Объект.Контракты.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр); ОбработкаТабличныхЧастей.РасчитатьСрокКонтракта(НоваяСтрока, мМаксимальныйСрокКонтрактаЛет, Истина, Ложь, Объект.Контракт) КонецЦикла; КонецПроцедуры &НаСервере Функция ПолучитьСписокКонтрактовНаПродление(ТекущаяСтрока = Неопределено, ОпределитьНомерКонтракта = Ложь) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВложенныйЗапрос.ФизЛицо КАК ФизЛицо, | ВложенныйЗапрос.ДатаОкончанияКонтракта КАК ДатаОкончанияКонтракта, | ВложенныйЗапрос.НомерКонтракта КАК НомерКонтракта, | ВложенныйЗапрос.ДатаНачалаКонтракта КАК ДатаНачалаКонтракта, | ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаОкончанияКонтракта, ДЕНЬ, 1) КАК КонтрактС, | ВЫБОР | КОГДА ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаОкончанияКонтракта, ГОД, 1) < ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаНачалаКонтракта, ГОД, &МаксимальныйСрокКонтрактаЛет) | ТОГДА ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаОкончанияКонтракта, ГОД, 1) | ИНАЧЕ ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаНачалаКонтракта, ГОД, &МаксимальныйСрокКонтрактаЛет) | КОНЕЦ КАК КонтрактПо, | 1 КАК КонтрактЛет, | Контракты.Регистратор КАК ДокументЗаключенияКонтракта, | ВложенныйЗапрос.Приказ |ПОМЕСТИТЬ ВТКонтрактыНаПродление |ИЗ | (ВЫБРАТЬ | КонтрактыСрезПоследних.ФизЛицо КАК ФизЛицо, | КонтрактыСрезПоследних.ДатаОкончанияКонтракта КАК ДатаОкончанияКонтракта, | КонтрактыСрезПоследних.НомерКонтракта КАК НомерКонтракта, | МАКСИМУМ(Контракты.Период) КАК ДатаНачалаКонтракта, | Контракты.Приказ КАК Приказ | ИЗ | РегистрСведений.Контракты.СрезПоследних( | , | НЕ &ОдинКонтракт | ИЛИ &ОдинКонтракт | И ФизЛицо = &Физлицо | И (НомерКонтракта = &НомерКонтракта | ИЛИ &ОпределитьНомерКонтракта)) КАК КонтрактыСрезПоследних | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Контракты КАК Контракты | ПО КонтрактыСрезПоследних.ФизЛицо = Контракты.ФизЛицо | И КонтрактыСрезПоследних.НомерКонтракта = Контракты.НомерКонтракта | И (НЕ Контракты.Регистратор ССЫЛКА Документ.ПродлениеКонтрактов) | И КонтрактыСрезПоследних.Приказ = Контракты.Приказ | ГДЕ | КонтрактыСрезПоследних.Контракт = &Контракт | И (КонтрактыСрезПоследних.ДатаОкончанияКонтракта <= &ДатаПо | ИЛИ &ДатаПо = &ПустаяДата) | И (КонтрактыСрезПоследних.ДатаОкончанияКонтракта >= &ДатаС | ИЛИ &ДатаС = &ПустаяДата) | | СГРУППИРОВАТЬ ПО | КонтрактыСрезПоследних.ФизЛицо, | КонтрактыСрезПоследних.ДатаОкончанияКонтракта, | КонтрактыСрезПоследних.НомерКонтракта, | Контракты.Приказ) КАК ВложенныйЗапрос | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Контракты КАК Контракты | ПО ВложенныйЗапрос.ФизЛицо = Контракты.ФизЛицо | И ВложенныйЗапрос.НомерКонтракта = Контракты.НомерКонтракта | И ВложенныйЗапрос.ДатаНачалаКонтракта = Контракты.Период | И (НЕ Контракты.Регистратор ССЫЛКА Документ.ПродлениеКонтрактов) | И ВложенныйЗапрос.Приказ = Контракты.Приказ |ГДЕ | ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаОкончанияКонтракта, ДЕНЬ, 1) < ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.ДатаНачалаКонтракта, ГОД, &МаксимальныйСрокКонтрактаЛет) | И Контракты.Контракт = &Контракт |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | РаботникиОрганизацийСрезПоследних.Физлицо, | РаботникиОрганизацийСрезПоследних.Приказ КАК Приказ, | МАКСИМУМ(РаботникиОрганизацийСрезПоследних.Регистратор) КАК Регистратор |ПОМЕСТИТЬ ВТРаботники |ИЗ | РегистрСведений.РаботникиОрганизаций.СрезПоследних( | &Дата, | Физлицо В | (ВЫБРАТЬ | ВТКонтрактыНаПродление.ФизЛицо | ИЗ | ВТКонтрактыНаПродление КАК ВТКонтрактыНаПродление)) КАК РаботникиОрганизацийСрезПоследних |ГДЕ | НЕ РаботникиОрганизацийСрезПоследних.Регистратор ССЫЛКА Документ.УвольнениеСотрудника | |СГРУППИРОВАТЬ ПО | РаботникиОрганизацийСрезПоследних.Физлицо, | РаботникиОрганизацийСрезПоследних.Приказ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТРаботники.Физлицо КАК Физлицо, | ВТКонтрактыНаПродление.ДатаОкончанияКонтракта, | ВТКонтрактыНаПродление.НомерКонтракта, | ВТКонтрактыНаПродление.ДатаНачалаКонтракта КАК ДатаНачалаКонтракта, | ВТКонтрактыНаПродление.КонтрактС, | ВТКонтрактыНаПродление.КонтрактПо, | ВТКонтрактыНаПродление.КонтрактЛет, | ВТКонтрактыНаПродление.ДокументЗаключенияКонтракта, | ВТРаботники.Приказ |ИЗ | ВТРаботники КАК ВТРаботники | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКонтрактыНаПродление КАК ВТКонтрактыНаПродление | ПО ВТРаботники.Физлицо = ВТКонтрактыНаПродление.ФизЛицо | И ВТРаботники.Приказ = ВТКонтрактыНаПродление.Приказ | |УПОРЯДОЧИТЬ ПО | ДатаНачалаКонтракта УБЫВ"; Запрос.УстановитьПараметр("Дата", Объект.Дата); Запрос.УстановитьПараметр("МаксимальныйСрокКонтрактаЛет", мМаксимальныйСрокКонтрактаЛет); Запрос.УстановитьПараметр("Контракт", Объект.Контракт); Запрос.УстановитьПараметр("ОпределитьНомерКонтракта", ОпределитьНомерКонтракта); Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1)); Если ТекущаяСтрока = Неопределено Тогда Запрос.УстановитьПараметр("Физлицо", Справочники.ФизическиеЛица.ПустаяСсылка()); //Запрос.УстановитьПараметр("ДатаНачалаКонтракта", Дата(1,1,1)); Запрос.УстановитьПараметр("НомерКонтракта", ""); Запрос.УстановитьПараметр("ОдинКонтракт", Ложь); Запрос.УстановитьПараметр("ДатаС", НачалоДня(Объект.ДатаС)); Запрос.УстановитьПараметр("ДатаПо", КонецДня(Объект.ДатаПо)); Иначе Запрос.УстановитьПараметр("Физлицо", ТекущаяСтрока.ФизЛицо); //Запрос.УстановитьПараметр("ДатаНачалаКонтракта", ТекущаяСтрока.ДатаНачалаКонтракта); Запрос.УстановитьПараметр("НомерКонтракта", ТекущаяСтрока.НомерКонтракта); Запрос.УстановитьПараметр("ОдинКонтракт", Истина); Запрос.УстановитьПараметр("ДатаС", Дата(1,1,1)); Запрос.УстановитьПараметр("ДатаПо", Дата(1,1,1)); КонецЕсли; Результат = Запрос.Выполнить(); ТЗ = Результат.Выгрузить(); Возврат ТЗ; КонецФункции // () |