Ответы к части 3
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 3.1. Реквизит объекта и реквизит формы: одно слово, два смысла
К вопросу 1. Ответ. У реквизита объекта хозяин — объект, и значение лежит в базе у каждой записи. У реквизита формы хозяин — форма, и значение живёт в данных открытого окна.
К вопросу 2. Ответ. По умолчанию — пока открыто окно, и после закрытия не остаётся ничего. Исключение одно: если у формы включено сохранение данных в настройках, значение вернётся к этому пользователю при следующем открытии. В базу оно не попадает и тогда.
К вопросу 3. Указание. Куда смотрит запрос?
Полное решение. Запрос к базе видит то, что в базе хранится, и больше ничего. Реквизита формы там нет — он живёт в данных открытой формы. Дело не в запретах, а в адресе: запрос ищет не там, где лежит значение. Отсюда и практическое следствие: если значение понадобилось в отчёте, скорее всего, оно должно храниться, то есть быть реквизитом объекта.
К вопросу 4. Ответ. Спросить, можно ли получить значение запросом. Можно — реквизит объекта; нельзя — реквизит формы.
К вопросу 5. Ответ. Потому что устроены они похоже: имя, тип и хозяин. Различает их хозяин, а с ним и срок жизни.
К вопросу 6. Ответ. Значение на экране есть, а в базе его нет: это реквизит формы. Обычно это сигнал, что значение завели не там, где ему место.
К вопросу 7. Ответ. В форме, среди её реквизитов. В дереве справочника его нет и быть не должно: это не свойство товара.
К упражнению «По образцу». Ответ. В списке объекта — наименование, артикул, единица и стандартные реквизиты; в списке формы — строка «Объект», а всё остальное появляется там, только если его завели. Совпадений между списками может не быть вовсе.
К упражнению «Своё: придумайте реквизит». Ответ. Например, флажок «показывать подробности» и строка поиска внутри формы. Оба нужны, пока окно открыто, и не описывают товар: хранить их в базе значило бы записывать привычки одного пользователя в свойства вещи.
К упражнению «Ловушка: „добавь поле в справочник"». Ответ. Просят реквизит объекта, а нужен реквизит формы — или даже настройка пользователя.
Полное решение. Формулировка «добавить в карточку галочку» описывает результат на экране, а не место хранения. Ключ в словах «каждый пользователь включал её себе»: значение зависит не от товара, а от того, кто смотрит. Если завести такое реквизитом объекта, галочка станет общей для всех, потому что запишется в товар. Место такому значению в форме, а если оно должно пережить закрытие окна — в настройках пользователя, о которых книга скажет позже.
К упражнению «Обратный ход». Ответ. Либо это реквизит формы, которого в базе нет; либо реквизит объекта, который в отчёт просто не вывели. Различить можно по списку реквизитов объекта.
К упражнению «На чтение». Ответ. «Итого» — реквизит формы: он живёт, пока открыто окно, в базе его нет и запрос его не найдёт. Скорее всего, значение считают при открытии или при изменении строк, а храниться ему незачем.
§ 3.2. Основной реквизит: главный предмет разговора
К вопросу 1. Ответ. Он выделен в списке реквизитов формы — отмечен как основной.
К вопросу 2. Ответ. Создаёт конструктор, собирая форму по объекту. Не будет его у произвольной формы.
К вопросу 3. Ответ. От типа объекта и вида формы: у формы одной записи это сама запись, у формы списка — список.
К вопросу 4. Указание. Что отличает форму, пригодную для карточки товара, от формы, пригодной для списка?
Полное решение. Пригодность формы на роль определяется типом её основного реквизита. Форма с основным реквизитом типа «объект справочника» говорит об одной записи — она годится как форма элемента. Форма со списком — как форма списка или выбора. В свойствах объекта из пригодных выбирают основную. Так замыкается линия, начатая в параграфе о назначении: устройство формы решает, на что она годится, а объект — какую из годных открывать.
К вопросу 5. Ответ. Реквизит формы. Но тип у него — объект справочника, поэтому внутри него лежат реквизиты объекта: артикул, единица, наименование.
К вопросу 6. Ответ. Потому что разговор ведётся об одном предмете, и форма должна знать, о каком.
К вопросу 7. Ответ. Для разговоров не о записи: помощники, настройки, служебные диалоги. Обычно такие формы лежат в общих формах.
К упражнению «По образцу». Ответ. «Объект» типа СправочникОбъект.Контрагенты.
К упражнению «Своё: предскажите тип». Ответ. У формы документа — «Объект» типа ДокументОбъект.ПоступлениеТоваров; у формы списка контрагентов — «Список», динамический список.
К упражнению «Ловушка: „переименую — станет понятнее"». Ответ. Окно не изменилось: отметка «основной» и тип остались прежними. Изменилось имя, по которому к реквизиту обращаются.
Полное решение. Переименование касается только адреса. Всё, что держится на отметке и типе, — данные записи в полях, вопрос о сохранении при закрытии, пригодность формы на роль — работает как раньше. Но код формы, если он есть, обращается к реквизиту по имени и перестанет его находить, а коллеги, открыв форму, будут искать привычное «Объект». Ясности прибавилось только самому разработчику, и то до первого чужого взгляда.
К упражнению «Обратный ход». Ответ. У формы нет предмета разговора: это произвольная форма. Скорее всего, она лежит в общих формах или открывается явно, а в основные формы объекта её не ставят.
К упражнению «На чтение». Ответ. Предмет разговора — «Объект» типа ДокументОбъект.Заказ, основной реквизит. «ПоказыватьОплаты» — вспомогательный реквизит формы: флажок, который живёт, пока открыто окно.
§ 3.3. Разворачиваем «Объект»: откуда в форме реквизиты товара
К вопросу 1. Ответ. Всё, из чего состоит запись: стандартные реквизиты вроде кода и наименования и реквизиты, заведённые в дереве справочника.
К вопросу 2. Ответ. Из типа основного реквизита. В форме хранится одна строка «Объект» с типом объекта справочника, а состав типа платформа берёт из описания справочника.
К вопросу 3. Ответ. Внутри «Объекта» новый реквизит появился сам. На экране ничего не изменилось: поля для него никто не положил.
К вопросу 4. Указание. Какие части формы хранятся в ней самой, а какие приносит тип?
Полное решение. У формы две разные части. Данные записи видны через тип основного реквизита, и этот тип всегда описывает объект таким, какой он сейчас, — поэтому новый реквизит внутри «Объекта» появляется сам. Раскладка — элементы, поля на экране — хранится в самой форме: это решение, принятое когда-то и записанное. Новое поле само себя не положит. Отсюда «отставание» своей формы: отстаёт не то, что форма знает, а то, что она показывает.
К вопросу 5. Ответ. Реквизит «Артикул» у записи, о которой разговаривает форма. Путь с другого начала ведёт к значению, которое форма держит у себя.
К вопросу 6. Ответ. На звено длиннее: Объект.Товары.Количество.
К вопросу 7. Ответ. Развернув основной реквизит: отдельными строками реквизиты объекта в списке формы не перечисляются.
К упражнению «По образцу». Ответ. Из дерева справочника — ИНН, Телефон и КонтактноеЛицо; стандартные — ссылка, код, наименование, пометка удаления. Родителя нет: справочник контрагентов не иерархический.
К упражнению «Своё: предскажите путь». Ответ. В форме контрагента — Объект.ИНН; в форме поступления — Объект.Товары.Цена.
К упражнению «Ловушка: „реквизит добавил, а форма не видит"». Ответ. Форма видит новый реквизит — данными, внутри «Объекта». Не видно поля. Нужно не пересоздавать форму, а положить поле, перетащив реквизит в элементы.
Полное решение. Пересоздание решило бы задачу грубо: конструктор снял бы свежий снимок, и поле появилось бы — но вместе с этим пропала бы вся раскладка, которую разработчик успел сделать. Путаница в том, что «форма не видит» смешивает две части формы. Данные у неё свежие, отстала раскладка — и лечится именно она, одним перетаскиванием.
К упражнению «Обратный ход». Ответ. «Комментарий» — реквизит объекта: он хранится в записи, о которой разговаривает форма, и в дереве объекта найдётся.
К упражнению «На чтение». Ответ. «Объект» — данные документа поступления, хранятся в базе. «ИтогоВес» — реквизит формы: живёт, пока открыто окно, и считается формой, в базе его нет.
§ 3.4. Дополнительные реквизиты формы: данные помимо записи
К вопросу 1. Ответ. Рядом с «Объектом», а не внутри него. Путь к ним — одно имя, без «Объект.».
К вопросу 2. Ответ. Вспомогательное значение для расчёта, временное значение ввода, переключатель режима.
К вопросу 3. Ответ. Понадобится ли это значение завтра другому человеку, открывшему ту же запись. Да — в запись; нет — в форму.
К вопросу 4. Ответ. Реквизит — это данные; на экране появляется элемент. Пока из реквизита не сделали элемент, пользователю показывать нечего.
К вопросу 5. Ответ. Даёт место для значения и возможность вывести его флажком. Не даёт реакции на изменение: чтобы флажок что-то прятал, нужен обработчик.
К вопросу 6. Указание. Одно из свойств — про вопрос при закрытии, другое — про память между открытиями. Какое у кого?
Полное решение. «Сохраняемые данные» — свойство реквизита. Оно делает изменение этого реквизита правкой данных формы: форма помечает себя изменённой и при закрытии спрашивает, сохранить ли. Сохранение данных в настройках — свойство формы, и оно про другое: значение отмеченного реквизита запоминается для пользователя и возвращается при следующем открытии. Первое отвечает на вопрос «было ли что сохранять», второе — «помнить ли выбор».
К вопросу 7. Ответ. Значение реквизита формы живёт, пока открыто окно: закрыли — оно пропало. Сохранение в настройках у формы включено не было.
К упражнению «По образцу». Ответ. В списке реквизитов формы контрагента рядом с «Объектом» появляется «ПоказыватьКонтакты», а после перетаскивания в элементы — поле, показанное флажком.
К упражнению «Своё: запись или форма». Ответ. Дата последней сверки — в запись: её спросит и другой человек. Строка поиска — в форму: она нужна одному окну. Количество строк — в форму: его можно посчитать в любой момент. Примечание к поступлению — в запись: оно часть документа.
К упражнению «Ловушка: „сделай, чтобы флажок работал"». Ответ. Сделано место для значения и флажок на экране. Не сделан обработчик, который на изменение флажка прячет и показывает поля. Это не ошибка, а половина задачи.
Полное решение. Заказчик видит результат на экране и ждёт поведения. Но поведение и данные — разные слои: реквизит формы хранит значение, а реакцию на его изменение задаёт обработчик. Сделанное не лишнее: без реквизита обработчику нечего было бы проверять. Честный ответ заказчику — «значение заведено, поведение будет добавлено», а не «сейчас починим».
К упражнению «Обратный ход». Ответ. Свойство «Сохраняемые данные» у реквизита формы, в котором хранится режим просмотра. Скорее всего, оно включено, и форма считает переключение режима правкой данных.
К упражнению «На чтение». Ответ. «Отбор» — строка, по которой, скорее всего, ищут в табличной части; «ИтогоВес» — посчитанный при открытии или при изменении строк итог. Оба нужны одному окну, завтра другому пользователю не понадобятся.
§ 3.5. Типы реквизитов формы: простые, ссылочные, особые
К вопросу 1. Ответ. Простые — одно значение; ссылочные — указатель на запись; особые — целая структура: таблица, список и дерево значений, динамический список.
К вопросу 2. Ответ. Особые. Реквизит объекта хранится в базе, и тип ему можно дать лишь такой, какой база умеет хранить в записи; данные формы живут в открытом окне, и ограничения хранения на них не действуют.
К вопросу 3. Ответ. Пропадёт выбор — сама ссылка в реквизите формы. Останется склад: запись лежит в базе и от закрытия окна не зависит.
К вопросу 4. Указание. Сравните по четырём признакам: где задана, где строки, кто видит, какой путь.
Полное решение. Табличная часть задана в дереве объекта, её строки хранятся в базе у записи, видны любой форме объекта и запросу, путь к ней — Объект.Товары. Таблица значений задана в форме, строки живут в данных открытого окна, видит их только эта форма, путь — просто имя реквизита. Похожи они внешне — строки и колонки, — но первая часть записи, а вторая часть разговора.
К вопросу 5. Ответ. Чтобы показать то, что посчитано, а не записано. Например, остатки товара по складам: они хранятся в регистре, а в карточке товара их удобно показать таблицей.
К вопросу 6. Ответ. К особым: «Список» формы списка — динамический список, со своими свойствами.
К вопросу 7. Ответ. Вид элемента следует из типа: строка, число и дата — поле ввода, булево — поле-флажок, ссылка — поле с кнопкой выбора, таблица значений — таблица.
К упражнению «По образцу». Ответ. Рядом с «Объектом» появляется «ПоследниеПоступления» с колонками «Документ» и «Сумма», а в элементах — таблица. В Предприятии она пустая: заполнить её может только обработчик.
К упражнению «Своё: подберите тип». Ответ. Склад для просмотра — ссылка на «Склады»; варианты сортировки — список значений; итоги по месяцам — таблица значений; признак «только просмотр» — булево.
К упражнению «Ловушка: „удалил выбор — удалился склад"». Ответ. Поле хранит ссылку на склад, а не сам склад. Очистить поле — значит убрать ссылку; запись склада в базе останется.
Полное решение. Страх понятен: в поле видно наименование склада, и кажется, что это и есть склад. Но реквизит формы — временный и хранит только указатель на запись. Очистка поля меняет указатель, а не то, на что он указывал. Чтобы склад действительно исчез, его нужно пометить на удаление в самом справочнике — совсем другое действие в другом месте.
К упражнению «Обратный ход». Ответ. В реквизитах формы: таблица, которой нет среди табличных частей объекта, — реквизит формы, скорее всего таблица значений. Её строки не хранятся в записи: их при открытии или по действию кладёт обработчик.
К упражнению «На чтение». Ответ. «Объект» и «Список» — основные реквизиты разных видов форм, и вместе в одной форме они не встречаются: основной реквизит один. «ИтогиПоМесяцам» — обычный дополнительный реквизит.
§ 3.6. Форма и запись: две жизни одних данных
К вопросу 1. Ответ. Форма живёт от открытия окна до закрытия. Запись лежит в базе, пока её не удалили.
К вопросу 2. Ответ. Столько, сколько людей открыли запись. У каждой формы внутри своя копия данных этой записи.
К вопросу 3. Ответ. Сервер читает запись из базы, копия попадает в данные формы, клиент строит по описанию формы окно и показывает копию.
К вопросу 4. Ответ. Прежний артикул: правка изменила копию в форме, а не запись в базе.
К вопросу 5. Ответ. «Записать», «Записать и закрыть», а у документа ещё и «Провести». Закрытие окна записью не является.
К вопросу 6. Указание. Что вообще живёт в форме?
Полное решение. Теряется всё, что жило в форме: и собственные её реквизиты — флажки, отборы, посчитанные таблицы, — и копия записи с несохранёнными правками. В базе остаётся то, что там было до открытия окна. Именно поэтому платформа перед закрытием измененной формы спрашивает о сохранении: другого шанса не будет.
К вопросу 7. Ответ. Увидит товар и все его данные — открыть на просмотр никто не мешает. Не удастся изменить: запись заперта для правки, пока вы не запишете или не закроете форму.
К упражнению «По образцу». Ответ. В списке контрагентов телефон прежний, пока не нажата запись; после закрытия без сохранения карточка открывается с прежним телефоном.
К упражнению «Своё: предскажите результат». Ответ. Из базы напечаталось бы прежнее наименование, из формы — новое. Разница и есть та самая граница между записью и копией.
К упражнению «Ловушка: „я же всё исправил"». Ответ. Скорее всего, он правил карточки и закрывал их, не записывая, — отвечая «нет» на вопрос о сохранении или закрывая крестиком. В базу правки не попали.
Полное решение. Ощущение «я всё исправил» опирается на то, что человек видел новые значения на экране. Видел он копию. Объяснять стоит не через устройство платформы, а через действие: правка считается сделанной, когда нажата запись; до этого она живёт только в открытом окне. Проверить легко — открыть список рядом: он показывает базу, а не чужую форму.
К упражнению «Обратный ход». Ответ. Скорее всего, ту же запись правит сейчас другой сеанс и она заперта для изменения. Начать стоит с вопроса, кто ещё держит эту карточку открытой; вторая возможность — не хватает прав на изменение.
К упражнению «На чтение». Ответ. Оба значения исчезли вместе с формой: «ИтогоВес» жил в форме, изменённый «Вес» лежал в копии записи. В базе — прежний вес.
§ 3.7. Чужая форма: основной реквизит и всё остальное
К вопросу 1. Ответ. С основного: он выделен полужирным и называет предмет разговора. Пока не назван предмет, остальные реквизиты не к чему отнести.
К вопросу 2. Ответ. Объект справочника или документа — форма об одной записи; динамический список — о множестве записей; основного нет — форма не о записи: помощник, настройки, служебный диалог.
К вопросу 3. Ответ. Откуда берётся значение, кто и когда его меняет и что с ним станет при закрытии формы.
К вопросу 4. Ответ. Потому что данные формы живут, пока открыто окно: при закрытии значение исчезнет вместе с формой.
К вопросу 5. Указание. Кто кладёт в такую таблицу строки?
Полное решение. Таблица значений — место для того, что посчитано, а не записано. Из базы она сама ничего не читает, поэтому её появление означает, что строки кто-то кладёт: обработчик при открытии или по команде, а иногда сам пользователь, если таблице разрешено добавлять строки. Отсюда следующий шаг разбора — найти, где эта таблица наполняется: там и будет видно, зачем форме такой реквизит.
К вопросу 6. Ответ. Служебное значение, придержанный до нужного момента результат, связку между командами формы — или след прежнего решения, если реквизит нигде не используется.
К вопросу 7. Ответ. Искать реквизит формы в дереве объекта; принимать развёрнутый «Объект» за список реквизитов формы; считать, что дополнительный реквизит где-то хранится.
К упражнению «По образцу». Ответ. Основной реквизит «Объект» типа СправочникОбъект.Товары — форма об одной записи справочника; внутри него состав товара из дерева; дополнительных реквизитов столько, сколько вы завели сами, и у каждого известно, откуда он взялся.
К упражнению «Своё: объясните каждый». Ответ. Каждая фраза должна быть о работе пользователя, а не об устройстве: «флажок решает, показывать ли подробности», «в таблице — остатки по складам, чтобы не открывать отчёт». Фраза вида «булево, потому что булево» объяснением не считается.
К упражнению «Ловушка: „этого поля нет в базе"». Указание. С какого имени начинается путь у этого поля?
Полное решение. Форма не сломана: поле связано не с реквизитом объекта, а с реквизитом формы, и в дереве справочника такого искать бессмысленно. Смотреть нужно в список реквизитов формы: там «Остаток» найдётся рядом с «Объектом», а не внутри него, и путь у поля будет без «Объект.». Значение в базе не хранится — его при открытии формы кто-то считает, чаще всего по регистру.
К упражнению «Обратный ход». Ответ. Возможны три объяснения: реквизит держит служебное значение и на экран не выводится; его кладёт одна команда, а читает другая; он остался от прежнего решения. Различают поиском: где «ВыбранныйСклад» используется — у элемента, в команде, в модуле формы.
К упражнению «На чтение». Ответ. Форма о множестве записей — список товаров. «ТекущийТовар», скорее всего, держит товар, на котором стоит курсор, чтобы форма могла что-то о нём показать или сделать; в базе это значение не хранится и исчезнет вместе с окном.